Python「內建函數」(built-in functions)就是不用 import,隨時可以直接呼叫的函數,像 print()、len()、range() 這些,都算。
sorted():排序
語法:
sorted(iterable, *, key=None, reverse=False)sorted() 會回傳一個排序過的新列表,不會修改原本的資料。它可以排序任何可迭代物件(列表、元組、字串、字典等)。# 基本排序
nums = [3, 1, 4, 1, 5, 9, 2, 6]
result = sorted(nums)
print(result) # [1, 1, 2, 3, 4, 5, 6, 9]
print(nums) # [3, 1, 4, 1, 5, 9, 2, 6](原列表不變)
# 降序排列
print(sorted(nums, reverse=True)) # [9, 6, 5, 4, 3, 2, 1, 1]sorted() vs list.sort()
sorted() 回傳新列表,原資料不變;list.sort() 是就地排序,會修改原列表,回傳 None。
nums = [3, 1, 2]
# sorted() 回傳新列表
new_list = sorted(nums)
print(new_list) # [1, 2, 3]
print(nums) # [3, 1, 2](不變)
# list.sort() 就地修改
nums.sort()
print(nums) # [1, 2, 3](已改變)用 key 自訂排序規則
key 參數接受一個函數,排序時會用這個函數的回傳值來比較。
# 按字串長度排序
words = ["banana", "pie", "apple", "kiwi"]
print(sorted(words, key=len)) # ['pie', 'kiwi', 'apple', 'banana']
# 按絕對值排序
nums = [-5, 3, -1, 4, -2]
print(sorted(nums, key=abs)) # [-1, -2, 3, 4, -5]
# 不分大小寫排序
names = ["bob", "Alice", "charlie", "David"]
print(sorted(names, key=str.lower))
# ['Alice', 'bob', 'charlie', 'David']排序各種可迭代物件
# 排序字串(按字元排列)
print(sorted("python")) # ['h', 'n', 'o', 'p', 't', 'y']
# 排序字典(按 key)
d = {"b": 2, "a": 1, "c": 3}
print(sorted(d)) # ['a', 'b', 'c']
print(sorted(d.items())) # [('a', 1), ('b', 2), ('c', 3)]
# 按 value 排序字典
print(sorted(d.items(), key=lambda x: x[1]))
# [('a', 1), ('b', 2), ('c', 3)]小小綜合例子
# 學生成績排名系統
students = [
{"name": "Alice", "score": 92, "age": 20},
{"name": "Bob", "score": 85, "age": 22},
{"name": "Charlie", "score": 92, "age": 19},
{"name": "Diana", "score": 78, "age": 21},
]
# 按分數排名(高到低)
by_score = sorted(students, key=lambda s: s["score"], reverse=True)
for rank, s in enumerate(by_score, 1):
print(f"第{rank}名:{s['name']} ({s['score']}分)")
# 多重排序:先按分數(降序),再按年齡(升序)
by_multi = sorted(students, key=lambda s: (-s["score"], s["age"]))
print("\n多重排序結果:")
for s in by_multi:
print(f" {s['name']}: {s['score']}分, {s['age']}歲")