鍍金池/ 問答/Python  網(wǎng)絡(luò)安全/ 一個(gè)關(guān)于lambda的小問題

一個(gè)關(guān)于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'}]

輸出結(jié)果:

[{'age': 50, 'name': 'Alan'},
{'age': 23, 'name': 'Bob'},
{'age': 32, 'name': 'Jon'}]

這是一個(gè)關(guān)于sorted函數(shù)的講解,我知道這里key是接收一個(gè)函數(shù),但是里面的x和-x我無法理解是怎么做到排序的,還希望前輩可以指點(diǎn)一二,先行謝過。

回答
編輯回答
落殤
(x['name'], -x['age'])

元組及其它可迭代對(duì)象(比如元組的第一項(xiàng)字符串也是)默認(rèn)比較順序是按照元素依次比較,順序類型為正序。
數(shù)字則是按大小比較。正序即從小到大,“-”號(hào)的就是相反數(shù),按相反數(shù)的正序,即逆序從大到小。
所以整體的意思就是先按名字從前往后(字符集順序),一樣則按年齡從大到小。

2017年3月7日 14:56
編輯回答
雨萌萌

排序是基于比較進(jìn)行的。所以name的比較是正比較,也就是較小的名字=較小的對(duì)象=排在更前面,較大的名字=較大的對(duì)象=排在更后面,這比較下來就可以根據(jù)名字排好序了。

第二個(gè)-age意思是在名字相同的對(duì)象(例如好幾個(gè)人的名字都叫John)之間,采用年齡的負(fù)比較,也就是年齡大的反而被認(rèn)為是?。ㄅ旁诟懊妫?,年齡小的反而被認(rèn)為是大(排在更后面)。

2017年10月23日 15:25
編輯回答
忠妾

這個(gè)lambda的功能已經(jīng)被 @代碼詩人芋頭 解釋的很清楚了

我想補(bǔ)充的是關(guān)于這個(gè)sorted是如何排序的

如果排序關(guān)鍵字是一個(gè)元組,例如('a', 1)('b', 0)排序,排序規(guī)則是從元組的第一個(gè)元素開始往后比較,直到遇到一個(gè)不相等的,這個(gè)時(shí)候哪個(gè)元組相應(yīng)的元素大,哪個(gè)元組就大。類似于字典序

所以這個(gè)sorted的意思是先按名字從小到大排序,如果名字一樣就按年齡從大到小排序

2017年5月4日 00:43