列表的 sort 方法可以根据自然顺序给其中的字符串、整数、元组等内置类型的元素进行排序。
对于字符串这样的基本类型,我们可能需要通过 key 函数先对它的内容做一些变换,并根据变换之后的结果来排序。
可以把辅助函数传给 sort 方法的 key 参数,让 sort 根据这个函数所返回的值来排列元素顺序,而不是根据元素本身来排列。
单值排序
普通排序
内置的列表(list)类型提供了名叫 sort 的方法,可以根据多项指标给 list 实例中的元素排序。
在默认情况下,sort 方法总是按照自然升序排列列表内的元素。
numbers = [93, 86, 11, 68, 70]
numbers.sort()
print(numbers)
列表中的字典排序
- 如果列表中嵌套了很多字典,如何对这些字典按照某键值排序?
# sorted 新的
nested_list = sorted(
nested_list,
key = lambda x: (
x["key1"],
x["key2"]
),
reverse = False # ⬆️
)
一般对象排序 - key + lambda
凡是具备自然顺序的内置类型几乎都可以用 sort 方法排列,例如字符串、浮点数等。但是,一般的对象又该如何排序呢? ```python class Tool: def init(self, name, weight):
def repr(self):self.name = name
self.weight = weight
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)
![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)
<a name="hV6Xs"></a>
# 多值排序
<a name="Btlp1"></a>
## 全部顺序 - 升 or 降
> **用元组?NONONO! 依旧 lambda + key**
```python
class Tool:
def __init__(self, name, weight):
self.name = name
self.weight = weight
def __repr__(self):
return f'Tool({self.name!r}, {self.weight})'
power_tools = [
Tool('drill', 4),
Tool('circular saw', 5),
Tool('jackhammer', 40),
Tool('sander', 4),
]
power_tools.sort(key=lambda x: (x.weight, x.name))
print(power_tools)
一升一降?- 两步走战略
class Tool:
def __init__(self, name, weight):
self.name = name
self.weight = weight
def __repr__(self):
return f'Tool({self.name!r}, {self.weight})'
power_tools = [
Tool('drill', 4),
Tool('circular saw', 5),
Tool('jackhammer', 40),
Tool('sander', 4),
]
power_tools.sort(key=lambda x: x.name) # Name ascending
power_tools.sort(key=lambda x: x.weight, # Weight descending
reverse=True)
print(power_tools)
总结
- 列表的
sort
方法可以根据自然顺序给其中的字符串、整数、元组等内置类型的元素进行排序。 - 普通对象,如果通过特殊方法定义了自然顺序,那么也可以用 sort 方法来排列,但这样的对象并不多见。
- 可以把辅助函数传给 sort 方法的 key 参数,让 sort 根据这个函数所返回的值来排列元素顺序,而不是根据元素本身来排列。
- 如果排序时要依据的指标有很多项,可以把它们放在一个元组中,让 key 函数返回这样的元组。对于支持一元减操作符的类型来说,可以单独给这项指标取反,让排序算法在这项指标上按照相反的方向处理。
- 如果这些指标不支持一元减操作符,可以多次调用 sort 方法,并在每次调用时分别指定 key 函数与 reverse 参数。最次要的指标放在第一轮处理,然后逐步处理更为重要的指标,首要指标放在最后一轮处理。