先描述下问题:
我有这么一个字典,内容如下:
a={“A”:1,”B”:2,”C”:3,”D”:2,”e”:3}
我需要根据字典里的值的大小对字典排序打印出来,最后的结果可以不是字典形式,我需要的只是按照字典的值把键和值按照从大到小或者从小到大的顺序排列出来即可。
网友给了我一个方法,可以实现这点,代码如下:
sorted(a.items(),key=lambda x: x[1])
关于这个方法,我有很多不理解的地方,经过反复讨论,推敲,大致搞懂了意思,下面来分析下:
1、这个代码中的X代表什么,X=a.items()吗?答案是否定的。a.items()本质上是一个可迭代的对象,在编辑器中打印出来,它代表的是:
dict_items([(‘A’, 1), (‘B’, 2), (‘C’, 3), (‘D’, 2), (‘e’, 3)])
那么这里的X代表的到底是什么?
我推测,这里的X代表的就是a.items()的一个遍历值,相当于
for x in a.items()中的X值。X值打印下,分别是:
(‘A’, 1)
(‘B’, 2)
(‘C’, 3)
(‘D’, 2)
(‘e’, 3)
这也就解释了为什么用sorted(a.items(),key=a.items()[1])
不行的原因。因为a.items()[1]根本就不是代表字典里面的值,a.items()甚至没有下标属性,也就是没有[1]这样的值。
2、sorted这个方法默认会把第一个参数的遍历值传递给key的输入值。回到例子中:
sorted(a.items(),key=lambda x: x[1])
在sorted方法中,会自动把a.items()的遍历值传递给X,作为输入值。那么我直接用sorted(a.items(),key=x[1])
可以不?测试发现也不行,我的理解是在sorted方法中,会自动把a.items()的遍历值做为key参数的输入值,但直接用key=x[1],这里的X已经不是输入值了。这里要使用这个输入值,就必须用到输入这个过程,也就是使用lambda这个表达式,在这个表达式中,X就是一个输入的值,也就是sorted方法传入过来的遍历值,key=lambda x: x[1]
代表把a.items()的遍历值传递给X,然后把结果的位置2的值返回给key
2023年6月7日补充:
sorted 语法:
sorted(iterable, key=None, reverse=False)
参数说明:
iterable — 可迭代对象。
key — 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse — 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
返回重新排序的列表。
sorted 的应用,可以通过 key 的值来进行数组/字典的排序,比如:
array = [{"age":20,"name":"a"},{"age":25,"name":"b"},{"age":10,"name":"c"}]
array = sorted(array,key=lambda x:x["age"])
print(array)
输出结果:
[{'age': 10, 'name': 'c'}, {'age': 20, 'name': 'a'}, {'age': 25, 'name': 'b'}]
还可以多列排序,先按照成绩降序排序,相同成绩的按照名字升序排序:
d1 = [{'name':'alice', 'score':38}, {'name':'bob', 'score':18}, {'name':'darl', 'score':28}, {'name':'christ', 'score':28}]
l = sorted(d1, key=lambda x:(-x['score'], x['name']))
print(l)
输出结果: