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()都有两个参数 keyreverse
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除了接受函数类型外,也接受匿名函数lambdalambda匿名函数格式如下:
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}]

参考博客

python字典排序方法

本文链接

https://www.cnblogs.com/jfchen/p/python-sort-and-sorted.html

posted @ 2022-08-06 10:54  文山湖的猫  阅读(1370)  评论(0编辑  收藏  举报