列表的 sort 方法可以根据自然顺序给其中的字符串、整数、元组等内置类型的元素进行排序。
对于字符串这样的基本类型,我们可能需要通过 key 函数先对它的内容做一些变换,并根据变换之后的结果来排序。
可以把辅助函数传给 sort 方法的 key 参数,让 sort 根据这个函数所返回的值来排列元素顺序,而不是根据元素本身来排列。

单值排序

普通排序

内置的列表(list)类型提供了名叫 sort 的方法,可以根据多项指标给 list 实例中的元素排序。
在默认情况下,sort 方法总是按照自然升序排列列表内的元素。

  1. numbers = [93, 86, 11, 68, 70]
  2. numbers.sort()
  3. print(numbers)

image.png

列表中的字典排序

  • 如果列表中嵌套了很多字典,如何对这些字典按照某键值排序?
    1. # sorted 新的
    2. nested_list = sorted(
    3. nested_list,
    4. key = lambda x: (
    5. x["key1"],
    6. x["key2"]
    7. ),
    8. reverse = False # ⬆️
    9. )

    一般对象排序 - key + lambda

    凡是具备自然顺序的内置类型几乎都可以用 sort 方法排列,例如字符串、浮点数等。但是,一般的对象又该如何排序呢? ```python class Tool: def init(self, name, weight):
    1. self.name = name
    2. self.weight = weight
    def repr(self):
    1. return f'Tool({self.name!r}, {self.weight})'

tools = [ Tool(‘level’, 3.5), Tool(‘hammer’, 1.25), Tool(‘screwdriver’, 0.5), Tool(‘chisel’, 0.25), ]

print(‘Unsorted:’, repr(tools)) tools.sort(key=lambda x: x.name) print(‘\nSorted: ‘, tools)

  1. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/22011425/1649385248842-1e2845f0-fe5f-4a25-9d8f-e5b5289df1d3.png#clientId=u5c2f5656-e5df-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=75&id=u903009d6&margin=%5Bobject%20Object%5D&name=image.png&originHeight=75&originWidth=715&originalType=binary&ratio=1&rotation=0&showTitle=false&size=9374&status=done&style=none&taskId=ua64da9ed-f04e-4e48-b94a-721f485830a&title=&width=715)
  2. <a name="hV6Xs"></a>
  3. # 多值排序
  4. <a name="Btlp1"></a>
  5. ## 全部顺序 - 升 or 降
  6. > **用元组?NONONO! 依旧 lambda + key**
  7. ```python
  8. class Tool:
  9. def __init__(self, name, weight):
  10. self.name = name
  11. self.weight = weight
  12. def __repr__(self):
  13. return f'Tool({self.name!r}, {self.weight})'
  14. power_tools = [
  15. Tool('drill', 4),
  16. Tool('circular saw', 5),
  17. Tool('jackhammer', 40),
  18. Tool('sander', 4),
  19. ]
  20. power_tools.sort(key=lambda x: (x.weight, x.name))
  21. print(power_tools)

image.png

一升一降?- 两步走战略

  1. class Tool:
  2. def __init__(self, name, weight):
  3. self.name = name
  4. self.weight = weight
  5. def __repr__(self):
  6. return f'Tool({self.name!r}, {self.weight})'
  7. power_tools = [
  8. Tool('drill', 4),
  9. Tool('circular saw', 5),
  10. Tool('jackhammer', 40),
  11. Tool('sander', 4),
  12. ]
  13. power_tools.sort(key=lambda x: x.name) # Name ascending
  14. power_tools.sort(key=lambda x: x.weight, # Weight descending
  15. reverse=True)
  16. print(power_tools)

image.png

总结

  • 列表的 sort 方法可以根据自然顺序给其中的字符串、整数、元组等内置类型的元素进行排序。
  • 普通对象,如果通过特殊方法定义了自然顺序,那么也可以用 sort 方法来排列,但这样的对象并不多见。
  • 可以把辅助函数传给 sort 方法的 key 参数,让 sort 根据这个函数所返回的值来排列元素顺序,而不是根据元素本身来排列。
  • 如果排序时要依据的指标有很多项,可以把它们放在一个元组中,让 key 函数返回这样的元组。对于支持一元减操作符的类型来说,可以单独给这项指标取反,让排序算法在这项指标上按照相反的方向处理。
  • 如果这些指标不支持一元减操作符,可以多次调用 sort 方法,并在每次调用时分别指定 key 函数与 reverse 参数。最次要的指标放在第一轮处理,然后逐步处理更为重要的指标,首要指标放在最后一轮处理。