[英]How sort a dict using the values of a list inside (two sequential criteria)
我需要用兩個連續的標准對這個字典進行排序:“等級”降序,“水果”升序(如果排名結果相同)。
字典是這樣構成的
'object':['fruit',rank]
例如,我已經:
myDict = {'item2': ['bananas', 3], 'item3': ['cocumbers', 11], 'item1': ['pinapples', 3], 'item4': ['pears', 3]}
我的目標是獲得此:
{'item3': ['cocumbers', 11], 'item2': ['bananas', 3],'item4': ['pears', 3], 'item1': ['pinapples', 3]}
同
sorted(myDict.items(), key=lambda (k, v): v[1], reverse=True)
我只獲得正確的等級排序,而沒有獲得具有相同等級的對象的排序順序:
[('item3', ['cocumbers', 11]), ('item2', ['bananas', 3]), ('item1', ['pinapples', 3]), ('item4', ['pears', 3])]
如何在python 2.7中解決這個問題?
謝謝
sorted(myDict.items(), key=lambda (k, v): (-v[1],v[0]))
應該可以。 由於rank
是一個整數,我們可以通過使key函數只返回負值而不是需要reverse=True
關鍵字來對sort進行排序,從而輕松地使其降序sorted
。 如果是平局,我們會退回到弦的自然順序。
之所以tuples
是因為python中的序列按字典順序排序( tuples
是序列類型) tuples
按順序比較每個序列中的元素,直到其中一個元素不相等為止,從而給出了一對序列的順序。
如果您無法輕松地用鍵函數替換reverse=True
,則需要進行兩次排序:
l1 = sorted(myDict.items(),key=lambda (k,v):v[0])
l1.sort(key=lambda (k,v):v[1],reverse=True)
這取決於有記錄的事實,即python排序必須穩定。 換句話說,元素的相對順序在排序前后是相同的。
您將需要使用collections.OrderedDict來維護字典中的順序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.