首页 问答 sort函数的参数是干啥用的?
问题详情
sort函数的参数(特别是keyreverse)是用来告诉 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 比较这些数字来决定顺序。

回答

主要有两个核心参数:

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参数:定义“排序方向”

  • 作用:它是一个布尔值(TrueFalse)。
  • 默认值: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

版权:言论仅代表个人观点,不代表官方立场。转载请注明出处:https://www.stntk.com/question/2544.html

发表评论
暂无评论

还没有评论呢,快来抢沙发~

点击联系客服

在线时间:8:00-16:00

客服QQ

70068002

客服电话

400-888-8888

客服邮箱

70068002@qq.com

扫描二维码

关注微信公众号

扫描二维码

手机访问本站