本文章使用Python 内置
sorted()
进行排序。注意sorted()
与列表(List)中.sort()
的区别。
字符串排序与数字排序存在差异。
字符串
二维排序
>>> print(sorted(["a1", "a2", "a10"]))
['a1', 'a10', 'a2'] # 有些场景下不是预期的排序结果
>>> print(sorted([1, 2, 10]))
[1, 2, 10]
字符串中,需要按照字母升序,数字升序排序
# 切片中的索引1 注意实际应用中的差异
# 数字已经要转换格式,否则字符串还是字符串排序
>>> print(sorted(["a1", "a2", "a10"], key=lambda x: (x[:1], int(x[1:]))))
['a1', 'a2', 'a10']
此处匿名函数lambda可以使用常规函数进行替换
>>> def func(x):
... return x[:1], int(x[1:])
...
>>> print(sorted(["a1", "a2", "a10"], key=func))
['a1', 'a2', 'a10']
字符串中,需要按照字母升序,数字降序排序
# 降序使用负数
# 更复杂的逻辑可以在常规函数中进行处理
>>> print(sorted(["a1", "a2", "a10"], key=lambda x: (x[:1], -int(x[1:]))))
['a10', 'a2', 'a1']
三维排序
字符串中,需要按照字母升序,数字降序排序,字母升序
# 降序使用负数
# 更复杂的逻辑可以在常规函数中进行处理
>>> print(sorted(["a1b", "a1a", "a2a", "a10a"], key=lambda x: (x[:1], -int(x[1:-1]), x[-1])))
['a10a', 'a2a', 'a1a', 'a1b']
多维列表 / 列表元素的值
与字符串差异点,字符串采用的是切片,列表使用索引
# 没有处理的默认排序
>>> print(sorted([["a", "1"], ["a", "2"], ["a", "10"]]))
[['a', '1'], ['a', '10'], ['a', '2']]
print(sorted([["a", "1"], ["a", "2"], ["a", "10"]], key=lambda x: (x[0], int(x[1]))))
[['a', '1'], ['a', '2'], ['a', '10']]
应用题来一道
先按照成绩降序排序,相同成绩的按照名字升序排序
data = [
{'name':'zhangsan', 'score':38},
{'name':'lisi', 'score':18},
{'name':'wangwu', 'score':28},
{'name':'lisan', 'score':28}
]
print(sorted(data, key=lambda x:(-x['score'], x['name'])))
输出结果:
[
{'name': 'zhangsan', 'score': 38},
{'name': 'lisan', 'score': 28},
{'name': 'wangwu', 'score': 28},
{'name': 'lisi', 'score': 18}
]
更多文章:
Python匿名函数lambda说明及示例 字典数字键排序
Python字典合并 多个字典的之合并为列表示例