一个关于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我无法理解是怎么做到排序的,还希望前辈可以指点一二,先行谢过。

阅读 3.4k
3 个回答

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

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

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

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

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

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题