一个关于lambda的小问题

发布于 2022-09-06 23:38:54 字数 527 浏览 24 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

陌路终见情 2022-09-13 23:38:54

排序是基于比较进行的。所以name的比较是正比较,也就是较小的名字=较小的对象=排在更前面,较大的名字=较大的对象=排在更后面,这比较下来就可以根据名字排好序了。

第二个-age意思是在名字相同的对象(例如好几个人的名字都叫John)之间,采用年龄的负比较,也就是年龄大的反而被认为是小(排在更前面),年龄小的反而被认为是大(排在更后面)。

傲鸠 2022-09-13 23:38:54

这个lambda的功能已经被 @代码诗人芋头 解释的很清楚了

我想补充的是关于这个sorted是如何排序的

如果排序关键字是一个元组,例如('a', 1)('b', 0)排序,排序规则是从元组的第一个元素开始往后比较,直到遇到一个不相等的,这个时候哪个元组相应的元素大,哪个元组就大。类似于字典序

所以这个sorted的意思是先按名字从小到大排序,如果名字一样就按年龄从大到小排序

许仙没带伞 2022-09-13 23:38:54

(x['name'], -x['age'])

元组及其它可迭代对象(比如元组的第一项字符串也是)默认比较顺序是按照元素依次比较,顺序类型为正序。
数字则是按大小比较。正序即从小到大,“-”号的就是相反数,按相反数的正序,即逆序从大到小。
所以整体的意思就是先按名字从前往后(字符集顺序),一样则按年龄从大到小。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文