Python sort() - List 排序
sort() 方法用來對 list 進行排序。
基本用法
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
numbers.sort()
print(numbers) # [1, 1, 2, 3, 4, 5, 6, 9]
語法
list.sort(key=None, reverse=False)
key:排序依據的函數reverse:是否降序排列,預設 False(升序)- 回傳:None(直接修改原 list)
降序排列
numbers = [3, 1, 4, 1, 5, 9]
numbers.sort(reverse=True)
print(numbers) # [9, 5, 4, 3, 1, 1]
字串排序
# 字母順序
words = ["banana", "apple", "cherry"]
words.sort()
print(words) # ['apple', 'banana', 'cherry']
# 大小寫敏感
words = ["Banana", "apple", "Cherry"]
words.sort()
print(words) # ['Banana', 'Cherry', 'apple'](大寫在前)
# 不區分大小寫
words.sort(key=str.lower)
print(words) # ['apple', 'Banana', 'Cherry']
key 參數
使用 key 指定排序依據:
# 依字串長度排序
words = ["python", "java", "c", "javascript"]
words.sort(key=len)
print(words) # ['c', 'java', 'python', 'javascript']
# 依絕對值排序
numbers = [-5, 3, -2, 1, -4]
numbers.sort(key=abs)
print(numbers) # [1, -2, 3, -4, -5]
使用 lambda
# 依據第二個元素排序
pairs = [(1, 'b'), (3, 'a'), (2, 'c')]
pairs.sort(key=lambda x: x[1])
print(pairs) # [(3, 'a'), (1, 'b'), (2, 'c')]
# 依據字典的值排序
items = [{"name": "Alice", "age": 30},
{"name": "Bob", "age": 25},
{"name": "Charlie", "age": 35}]
items.sort(key=lambda x: x["age"])
print([item["name"] for item in items]) # ['Bob', 'Alice', 'Charlie']
sort() vs sorted()
# sort() - 修改原 list,回傳 None
numbers = [3, 1, 2]
result = numbers.sort()
print(numbers) # [1, 2, 3]
print(result) # None
# sorted() - 回傳新 list,不修改原 list
numbers = [3, 1, 2]
result = sorted(numbers)
print(numbers) # [3, 1, 2](不變)
print(result) # [1, 2, 3]
sorted() 可以用於任何可迭代物件:
# 排序 tuple
t = (3, 1, 2)
print(sorted(t)) # [1, 2, 3]
# 排序字串
s = "python"
print(sorted(s)) # ['h', 'n', 'o', 'p', 't', 'y']
# 排序 set
s = {3, 1, 2}
print(sorted(s)) # [1, 2, 3]
多重排序
students = [
("Alice", 85),
("Bob", 90),
("Charlie", 85),
("David", 90)
]
# 先依分數降序,再依名字升序
students.sort(key=lambda x: (-x[1], x[0]))
print(students)
# [('Bob', 90), ('David', 90), ('Alice', 85), ('Charlie', 85)]
使用 operator.itemgetter:
from operator import itemgetter
students = [
{"name": "Alice", "grade": 85, "age": 20},
{"name": "Bob", "grade": 90, "age": 19},
{"name": "Charlie", "grade": 85, "age": 21}
]
# 依 grade 排序
students.sort(key=itemgetter("grade"))
print([s["name"] for s in students]) # ['Alice', 'Charlie', 'Bob']
實際範例
排序檔案列表
files = ["file10.txt", "file2.txt", "file1.txt"]
# 字串排序(不正確)
files_sorted = sorted(files)
print(files_sorted) # ['file1.txt', 'file10.txt', 'file2.txt']
# 自然排序
import re
def natural_key(s):
return [int(t) if t.isdigit() else t for t in re.split(r'(\d+)', s)]
files.sort(key=natural_key)
print(files) # ['file1.txt', 'file2.txt', 'file10.txt']
排序物件
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"Person({self.name}, {self.age})"
people = [
Person("Alice", 30),
Person("Bob", 25),
Person("Charlie", 35)
]
# 依年齡排序
people.sort(key=lambda p: p.age)
print(people) # [Person(Bob, 25), Person(Alice, 30), Person(Charlie, 35)]
穩定排序
Python 的排序是穩定的,相等的元素會保持原本的順序:
data = [("a", 2), ("b", 1), ("c", 2), ("d", 1)]
# 先依數字排序
data.sort(key=lambda x: x[1])
print(data) # [('b', 1), ('d', 1), ('a', 2), ('c', 2)]
# 相同數字的元素保持原本順序
時間複雜度
Python 使用 Timsort 演算法,時間複雜度是 O(n log n)。