Python的sort和sorted函数
Python的sort和sorted函数
1. sort和sorted的区别
sort()
和sorted()
都是Python的排序函数,但sort()
只在list
对象内部定义,sorted()
可以支持所有的可迭代序列。所以sort()
本身并无返回值,调用后会直接对list
自身进行排序,而sorted()
则会返回一个排序后的列表,不会对可迭代序列做任何修改。
>>> a = [1, 2, 1, 4, 3]
>>> sorted(a) # 返回列表
[1, 1, 2, 3, 4]
>>> a # 本身不对序列做修改
[1, 2, 1, 4, 3]
>>> a.sort() # 无返回值
>>> a # 直接修改序列
[1, 1, 2, 3, 4]
2. key 和 reverse 参数
sorted()
和 sort()
都有两个参数 key
和 reverse
。
reverse = False
则表示输出的结果是升序排序,这也是默认值。reverse = True
则表示输出的结果是降序排序。
>>> a = [1, 2, 1, 4, 3]
>>> sorted(a) # 默认值 reverse = False
[1, 1, 2, 3, 4]
>>> sorted(a, reverse = True)
[4, 3, 2, 1, 1]
key
参数是排序函数,即排序规则。
python默认的排序规则是按照可迭代序列每个元素的大小升序排序,如果这个元素同样是一个可迭代序列,则会不停的套娃,一直细分下去。
例如二维列表[[1, 2], [2, 1], [1, 1]]
,这个列表的元素还是一个列表,则第一排序规则就是子列表的第一元素的大小。这时,[1, 2]
排在 [2, 1]
的前面。但在排序[1, 2]
和[1, 1]
时,由于第一元素相等,则会比较第二个元素,[1, 1]
排在[1, 2]
前面
>>> a = [[1, 2], [2, 1], [1, 1]]
>>> sorted(a)
[[1, 1], [1, 2], [2, 1]]
key
的作用就是提供一个自定义的排序函数,sorted()
会将待排序序列的每一个元素都传入key
函数,并按照返回值的大小排序。例如,我想将一个列表按照降序排序,但不用reverse
参数
def func(x):
return -x
a = [1, 2, 1, 4, 3]
b = sorted(a, key=func)
print(b) # 输出[4, 3, 2, 1, 1]
3. lambda匿名函数
key
除了接受函数类型外,也接受匿名函数lambda
。lambda
匿名函数格式如下:
lambda [arg1, arg2, ... , arg3] : expression
冒号前面代表函数的参数,可以有多个,冒号后面代表函数的返回值。利用lambda
可以快速定义函数。
仍然以降序排序列表为例,上面的func()
函数可以被lambda
替换为
>>> a = [1, 2, 1, 4, 3]
>>> sorted(a, key = lambda x:-x)
[4, 3, 2, 1, 1]
利用key
参数,可以做很多操作。例如,我想将二维列表[[1, 2], [2, 1], [1, 1]]
,先按第一个元素升序排序,如果第一个元素相等,就按第二个元素降序排序
>>> a = [[1, 2], [2, 1], [1, 1]]
>>> sorted(a, key = lambda x:(x[0],-x[1]))
[[1, 2], [1, 1], [2, 1]]
4. 字典的排序
字典本身不支持sort()
,只能用sorted()
排序。
第一种:最常见的单个字典格式数据排序
>>> a = {'a': 3, 'c': 89, 'b': 0, 'd': 34}
>>> sorted(a.items(), key = lambda x: x[0]) # 按照字典的键进行排序
[('a', 3), ('b', 0), ('c', 89), ('d', 34)]
>>> sorted(a.items(), key = lambda x: x[1]) # 按照字典的值进行排序
[('b', 0), ('a', 3), ('d', 34), ('c', 89)]
>>> c = sorted(a.items(), key = lambda x: x[1])
>>> dict(c) # 得到排好序的字典
{'b': 0, 'a': 3, 'd': 34, 'c': 89}
因为sorted()
返回的是一个列表,如果需要得到一个排好序的字典,可以直接用dict()
进行处理
第二种:字典列表排序,即列表元素是一个字典
b = [{'name': 'lee', 'age': 23}, {'name': 'lam', 'age': 12}, {'name': 'lam', 'age': 18}]
>>> sorted(b, key = lambda x: x['name']) # 按照'name'排序
[{'name': 'lam', 'age': 12}, {'name': 'lam', 'age': 18}, {'name': 'lee', 'age': 23}]
>>> sorted(b, key = lambda x: x['age'], reverse = True) # 按照'age'降序排序
[{'name': 'lee', 'age': 23}, {'name': 'lam', 'age': 18}, {'name': 'lam', 'age': 12}]
参考博客
本文链接
https://www.cnblogs.com/jfchen/p/python-sort-and-sorted.html