一个关于lambda的小问题
persons= [{'name': 'Jon', 'age': 32}, {'name': 'Alan', 'age': 50}, {'name':'Bob', 'age':23}]
sorted(persons, key = lambda x: (x['name'], -x['age']))
persons
[{'age': 32, 'name': 'Jon'},
{'age': 50, 'name': 'Alan'},
{'age': 23, 'name': 'Bob'}]
输出结果:
[{'age': 50, 'name': 'Alan'},
{'age': 23, 'name': 'Bob'},
{'age': 32, 'name': 'Jon'}]
这是一个关于sorted函数的讲解,我知道这里key是接收一个函数,但是里面的x和-x我无法理解是怎么做到排序的,还希望前辈可以指点一二,先行谢过。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
排序是基于比较进行的。所以
name
的比较是正比较,也就是较小的名字=较小的对象=排在更前面,较大的名字=较大的对象=排在更后面
,这比较下来就可以根据名字排好序了。第二个
-age
意思是在名字相同的对象(例如好几个人的名字都叫John)之间,采用年龄的负比较,也就是年龄大的反而被认为是小(排在更前面),年龄小的反而被认为是大(排在更后面)。这个lambda的功能已经被 @代码诗人芋头 解释的很清楚了
我想补充的是关于这个sorted是如何排序的
如果排序关键字是一个元组,例如
('a', 1)
和('b', 0)
排序,排序规则是从元组的第一个元素开始往后比较,直到遇到一个不相等的,这个时候哪个元组相应的元素大,哪个元组就大。类似于字典序所以这个
sorted
的意思是先按名字从小到大排序,如果名字一样就按年龄从大到小排序元组及其它可迭代对象(比如元组的第一项字符串也是)默认比较顺序是按照元素依次比较,顺序类型为正序。
数字则是按大小比较。正序即从小到大,“-”号的就是相反数,按相反数的正序,即逆序从大到小。
所以整体的意思就是先按名字从前往后(字符集顺序),一样则按年龄从大到小。