Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Sort (排序)

🎯 1. Python sort 是什么?

Python 有两种排序:

list.sort()

  • 原地排序(in-place)
  • 改变原列表
  • 返回值永远是 None

sorted(iterable)

  • 返回一个新列表
  • 原对象不变(适用于 tuple、dict keys 等不可变序列)

🟦 2. 最常用示例

原地排序(升序)

data = [5, 1, 3]
data.sort()
# data = [1, 3, 5]

返回新列表(推荐)

data = [5, 1, 3]
new_list = sorted(data)
# new_list = [1, 3, 5]

🟩 3. 降序排序(reverse=True)

sorted(data, reverse=True)

等价于:

data.sort(reverse=True)

🟦 4. key 函数排序(最重要)

sort 和 sorted 均支持:

sorted(data, key=函数)

示例:按照字符串长度排序

words = ["apple", "a", "python", "hi"]
sorted(words, key=len)

示例:按照字典字段排序

data = [
    {"name": "jack", "age": 20},
    {"name": "lucy", "age": 18},
]
sorted(data, key=lambda x: x["age"])

🟩 5. 多字段排序(最实用)

按 age 升序,再按 name 升序

sorted(data, key=lambda x: (x["age"], x["name"]))

按 age 升序,但 name 逆序

sorted(data, key=lambda x: (x["age"], -ord(x["name"][0])))

更优雅方式:

sorted(data, key=lambda x: (x["age"], x["name"]), reverse=False)

但 reverse=True 会给所有字段倒序,不推荐用于多字段逆序。

🟦 6. 排序复杂对象(例如类)

class User:
    def __init__(self, name, score):
        self.name = name
        self.score = score

users = [
    User("a", 80),
    User("b", 60),
]
sorted(users, key=lambda u: u.score)

🟩 7. 使用 operator(更快更优雅)

from operator import itemgetter, attrgetter

对 dict 排序(比 lambda 快)

sorted(data, key=itemgetter("age"))

对对象排序

sorted(users, key=attrgetter("score"))

🟦 8. 对中文排序(拼音)

import locale
locale.setlocale(locale.LC_ALL, "zh_CN.UTF-8")
sorted(names, key=locale.strxfrm)

🟩 9. 自定义排序规则(很少用,但强大)

使用 functools.cmp_to_key:

from functools import cmp_to_key

def cmp(a, b):
    if a["score"] > b["score"]:
        return -1
    if a["score"] < b["score"]:
        return 1
    return 0

sorted(data, key=cmp_to_key(cmp))

🟦 10. sort 不返回值!常见坑

错误:

result = data.sort()  # None!

正确:

data.sort()
# or
result = sorted(data)

🟩 11. 对嵌套结构排序

data = {
    "items": [
        {"code": "600001", "score": 12},
        {"code": "000005", "score": 20},
    ]
}
sorted_items = sorted(data["items"], key=lambda x: x["score"], reverse=True)

🟦 12. 对 tuple 列表排序

pairs = [(3, "a"), (1, "c"), (2, "b")]
sorted(pairs)  # 默认按第1个,再按第2个字段

🟩 13. 实战:排序股票代码

按数字排序(字符串转整数)

sorted(codes, key=lambda x: int(x))

只按前两位(行业分类常用)

sorted(codes, key=lambda x: x[:2])

🟦 14. 实战:股票数据按涨跌幅排序

sorted(data, key=lambda x: x["change"], reverse=True)

🟦 15. sort vs sorted 总结对比(收藏)

功能 list.sort() sorted()
是否返回新对象 ❌ 否 ✅ 是
是否修改原对象 ✅ 是 ❌ 否
是否适用于任意 iterable ❌ 否 ✅ 是
推荐场景 长列表高性能排序 任何排序场景

🟩 16. 超简速查表(收藏版)

任务 写法
升序排序 sorted(data)
降序排序 sorted(data, reverse=True)
按字段排序 sorted(data, key=lambda x: x["k"])
多字段排序 sorted(data, key=lambda x: (x["a"], x["b"]))
排序对象 sorted(users, key=lambda u: u.age)
更高性能排序 itemgetter/attrgetter
自定义比较规则 cmp_to_key
原地排序 data.sort()