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)。