簡體   English   中英

按字典對字典進行排序,然后在值相等的情況下對其鍵進行排序,然后輸出列表

[英]Sorting a dictionary by its value, and then its key if values are equal then outputting a list

map={"a":5, "b":2, "c":7, "d":5, "e":5}

輸出應該是:

['c', 'a', 'd', 'e', 'b']

因此,代碼應首先按其值按降序排列字典,然后如果其值相同,則應按鍵按升序排序。 到目前為止我有......

newmap=map
newmap=sorted(newmap.iteritems(), key=operator.itemgetter(1,0),reverse=True)
print newmap

這給了我輸出[('c', 7), ('e', 5), ('d', 5), ('a', 5), ('b', 2)] 所以,我需要按升序獲得e,d,a ...而不會弄亂各種數字。 我該怎么做呢?

在我的回答中,我用dct替換了map以不掩蓋內置函數。

按逆值對鍵進行排序,然后按鍵按升序排序:

sorted(dct, key=lambda k: (-dct[k], k))

通過將值轉換為負數,可以反向對值進行排序,而按鍵則按升序排序。

演示:

>>> dct = {'a': 5, 'c': 7, 'b': 2, 'e': 5, 'd': 5}
>>> sorted(dct, key=lambda k: (-dct[k], k))
['c', 'a', 'd', 'e', 'b']

時間比較:

>>> import timeit
>>> timeit.timeit("sorted(dct, key=lambda k: (-dct[k], k))", 'from __main__ import dct')
4.741436004638672
>>> timeit.timeit("map(operator.itemgetter(0), sorted(dct.items(), key=lambda i: (-i[1], i[0])))", 'from __main__ import dct; import operator')
7.489126920700073
>>> timeit.timeit("map(operator.itemgetter(0), sorted(sorted(dct.iteritems()), key=operator.itemgetter(1), reverse=True))", 'from __main__ import dct; import operator')
10.01669192314148

在Python中保證排序是穩定的,所以你要做的就是排序兩次:首先是鍵,然后是值。

sorted_pairs = sorted(sorted(map.iteritems()), key=operator.itemgetter(1), reverse=True)

要從此輸出中獲取密鑰,您可以使用列表解析:

[k for k,v in sorted_pairs]

PS不會將您的變量命名為與Python類型相同,否則您有一天會感到非常驚訝。

假設你有一個列表如下:

l = [('a', 1), ('c', 1), ('b', 1), ('aa', 2), ('aa', 3), ('aa', 1)]

情況1:預期:值首先是最低值,然后是相同值,按升序排列。

想法:以數字優先,然后是鍵的方式組合鍵值。

>>> sorted(l, key=lambda y: str(y[1])+y[0])
[('a', 1), ('aa', 1), ('b', 1), ('c', 1), ('aa', 2), ('aa', 3)]

案例2:預期:首先顯示最高值。 如果鍵具有相同的值,則按字母順序的升序排序。

>>> sorted(l, key=lambda y: str(10-y[1]) + y[0])
[('aa', 3), ('aa', 2), ('a', 1), ('aa', 1), ('b', 1), ('c', 1)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM