簡體   English   中英

排序python字典,其中“值”作為主鍵,“鍵”作為輔助鍵

[英]Sort python dictionaries with 'value' as primary key and 'key' as secondary

我在這里嘗試做的是根據字符串中出現的次數以降序顯示字符。 如果兩個字符共享相同的出現次數,則應按照字母順序顯示它們。

因此,給定字符串“ abaddbccdd”,我要顯示為輸出的內容是:['d','a','b','c']

到目前為止,這是我所做的:

>>> from collections import Counter
>>> s = 'abaddbccdd'
>>> b = Counter(s)
>>> b
Counter({'d': 4, 'a': 2, 'c': 2, 'b': 2})
>>> b.keys()
['a', 'c', 'b', 'd']
>>> c = sorted(b, key=b.get, reverse=True)
>>> c
['d', 'a', 'c', 'b']
>>>

但是如何處理第二部分? “ a”,“ b”和“ c”在文本中都出現了兩次,並且順序不正確。 什么是最好的方法(希望也是最短的方法)?

最短的方法是:

>>> sorted(sorted(b), key=b.get, reverse=True)
['d', 'a', 'b', 'c']

因此,按自然順序(鍵順序)對序列進行一次排序,然后對值進行反向排序。

請注意,如果字典很大,因為它執行兩種完整排序,則運行時間不會最快,但是實際上,這可能是最簡單的,因為您希望值遞減而鍵遞增。

它起作用的原因是Python保證排序是穩定的。 這意味着當鍵相等時,將保留原始順序,因此,如果您從最后一個鍵重復排序到第一個鍵,則將獲得所需的結果。 另外, reverse=True與僅反轉輸出不同,因為它也尊重穩定性,並且僅在鍵不同的情況下反轉結果。

這可以通過一次排序就可以完成。 訣竅是進行升序排序,將計數數字取為主要排序關鍵字,將字典的關鍵字字符串取為次要排序關鍵字。

b = {'d': 4, 'a': 2, 'c': 2, 'b': 2}
c = sorted(b, key=lambda k:(-b[k], k))
print(c)

產量

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

如果您已經在使用Counter對象,則可以使用Counter.most_common方法。 這將按頻率從高到低的順序返回項目列表。

>>> b.most_common()
[('d', 4), ('a', 2), ('b', 2), ('c', 2)]

您可以使用lambda函數:

>>> sorted(b, key=lambda char: (b.get(char), 1-ord(char)), reverse=True)

暫無
暫無

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

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