首页 新闻 会员 周边

sort函数的参数是干啥用的?

0
[已解决问题] 解决于 2026-03-13 17:56
sort 函数的参数(特别是 key 和 reverse)是用来告诉 Python“按照什么规则”来排序的。
如果不给参数,Python 只会“死板地”按默认规则(数字从小到大,字母 A-Z)排。
给了参数,你就可以自定义任何复杂的排序逻辑。
如果集合中里面是多个三个元素的元组,那么sort()默认按照什么排序呢
data = [(1, "b", 9), (1, "a", 8), (2, "c", 5), (1, "b", 2)]
当你直接调用 data.sort() 不带任何参数时,Python 会按照 “字典序” (Lexicographical Order) 进行排序。

核心规则:从左到右,依次比较

就像查英文字典一样:
  1. 先比第 1 个元素(索引 0)。
    • 如果第 1 个元素不同,谁小谁排前面,后面的元素根本不看。
    • 如果第 1 个元素相同,则进入下一步。
  2. 再比第 2 个元素(索引 1)。
    • 如果第 2 个元素不同,谁小谁排前面
    • 如果第 2 个元素也相同,则进入下一步。
  3. 最后比第 3 个元素(索引 2)。
    • 以此类推,直到分出胜负或所有元素都相同。

如果里面是多个字典,L = [{"name": "Alice", "age": 25}, {"name": "Bob", "age": 20}]

当你直接调用 L.sort() 不带任何参数时:

🚨

结果:直接报错!(TypeError)

在 Python 3 中,字典之间不能直接比较大小。
你会得到类似这样的错误:
TypeError: '<' not supported between instances of 'dict' and 'dict'
没有默认顺序:字典是“键值对”的集合,不像元组或列表那样有明确的“第1个元素、第2个元素”的顺序
如果你想对字典列表排序,必须告诉 Python 具体按照字典里的哪个键 (Key) 来排序。

场景 1:按某个特定的键排序(最常用)

比如,按 "age" 从小到大排:
L = [ {"name": "Alice", "age": 25}, {"name": "Bob", "age": 20}, {"name": "Charlie", "age": 22} ] # 使用 lambda 提取每个字典的 'age' 值作为比较依据 L.sort(key=lambda x: x["age"]) print(L) # 输出: [{'name': 'Bob', 'age': 20}, {'name': 'Charlie', 'age': 22}, {'name': 'Alice', 'age': 25}]
  • x 代表列表中的每一个字典(如 {"name": "Alice", "age": 25})。
  • x["age"] 取出年龄数字。
  • Python 比较这些数字来决定顺序。
*Tesla*的主页 *Tesla* | 小虾三级 | 园豆:1516
提问于:2026-03-13 17:37
< >
分享
最佳答案
0
主要有两个核心参数:

1. key 参数:定义“排序依据” (最重要!)

  • 作用:它接收一个函数。
  • 工作流程:
    1. Python 会把列表里的每一个元素,依次扔进这个函数里。
    2. 函数会返回一个值(我们叫它“分数”或“关键字”)。
    3. Python 只根据这个返回的值来进行大小比较和排序。
    4. 注意:列表里原本的元素不会变,变的只是它们排列的顺序。

L.sort(key=lambda x: order_map[x[0]])

    • 含义:“请别直接比元组 (4, 'c') 和 (1, 'a') 谁大谁小(因为元组比较复杂)。请先把它们转换成 order_map里的排名分数(比如 3 和 0),然后只比分数!”
    • 结果:分数小的(0)排前面,分数大的(3)排后面。
  • 常见用法举例:
    • key=len:按字符串长度排序(短的在前)。
    • key=lambda x: x[1]:按元组的第二个元素排序。
    • key=str.lower:按字母忽略大小写排序

reverse 参数:定义“排序方向”

  • 作用:它是一个布尔值(True 或 False)。
  • 默认值:False(升序,从小到大)。
  • 如果设为 True:降序(从大到小)。

 

想按照自定义的特定顺序排序

如果你提供的列表 [1, 2, 5, 4, 9] 是想表达:“我希望结果严格按照 1, 2, 5, 4, 9 这个顺序排列,而不是自然的大小顺序”。
这时你需要构建一个映射字典,让 key 函数返回每个元素在这个自定义列表中的索引位置。
 

L = [(1,"a"),(2,"b"),(5,"e"),(9,"f"),(4,"c")]

custom_order = [1, 2, 5, 4, 9]

# 创建一个映射:{1:0, 2:1, 5:2, 4:3, 9:4}

# 这样排序时,1的权重是0(最小),9的权重是4(最大)

order_map = {val: i for i, val in enumerate(custom_order)}

L.sort(key=lambda x: order_map[x[0]]) print(L)

# 输出: [(1, 'a'), (2, 'b'), (5, 'e'), (4, 'c'), (9, 'f')]

# 注意:这里 5 排在了 4 前面,因为 custom_order 里 5 在 4 前面 

遍历列表里的每一项 for item in list_to_sort: # item 就是列表里的某一项,比如 (4, "c") # 3. 【自动喂食】把这一项 (item) 作为参数,传给你提供的函数 (key_function) # 这里的 item 就变成了你函数里的 x

*Tesla* | 小虾三级 |园豆:1516 | 2026-03-13 17:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册