簡體   English   中英

如果字典只出現一次,則按值對字典排序

[英]Sorting a dictionary by values if it occurs once otherwise by keys

我有這本字典,我需要按值對單詞排序。 但是,當兩個或多個單詞具有相同的值時,我需要按字母對這些單詞進行排序,但我不知道該怎么做。 你能幫我嗎?

dict = {'BLACK': 0, 'brown': 1, 'RED': 2, 'orange': 4, 'YELLOW': 7, 'green': 5, 'BLUE': 4,
        'violet': 2, 'GRAY': 3, 'White': 6}

先感謝您

利用tuple將其元素進行一對一比較的事實。

d = {'BLACK': 0, 'brown': 1, 'RED': 2, 'orange': 4, 'YELLOW': 7, 'green': 5, 'BLUE': 4,
     'violet': 2, 'GRAY': 3, 'White': 6}
result = sorted(d, key=lambda k: (d[k], k.lower()))

還修復了dict不應該用作變量名的問題-它是內置類型。

使用sorted

>>> d = {'BLACK': 0, 'brown': 1, 'RED': 2, 'orange': 4, 'YELLOW': 7, 'green': 5, 'BLUE': 4,
        'violet': 2, 'GRAY': 3, 'White': 6}
>> sorted(d, key=lambda i: (d[i], i.lower()))
['BLACK', 'brown', 'RED', 'violet', 'GRAY', 'BLUE', 'orange', 'green', 'White', 'YELLOW']

注意:這假定所有內容均應為小寫,因為python在大寫單詞之前對大寫單詞進行排序。

我也將您的變量重命名為d因為dict是內置的。

分解正在發生的事情:

在字典上sorted將返回按提供的功能鍵排序的key (默認為鍵的直接比較)

>>> sorted(d)
['BLACK', 'BLUE', 'GRAY', 'RED', 'White', 'YELLOW', 'brown', 'green', 'orange', 'violet']

要按值排序,請使用dict.get

>>> sorted(d, key=d.get)
['BLACK', 'brown', 'RED', 'violet', 'GRAY', 'orange', 'BLUE', 'green', 'White', 'YELLOW']

然后,如果出現平局,我們必須按鍵排序。 因為python一對一地比較其元組,所以我們可以構造一個(value, key)的元組,它將比較項目,如果它們相同,則將比較項目。

>>> (4, "blue") < (4, "orange")
True
>>> (4, "blue") < (3, "orange")
False

您可以嘗試以下方法:

>>> d = {'BLUE': 4, 'brown': 1, 'BLACK': 0, 'YELLOW': 7, 'violet': 2, 'orange': 4, 'green': 5, 'White': 6, 'GRAY': 3, 'RED': 2}
>>> t = (zip(d.values(), d.keys()))
>>> sorted(t)
[(0, 'BLACK'), (1, 'brown'), (2, 'RED'), (2, 'violet'), (3, 'GRAY'), (4, 'BLUE'), (4, 'orange'), (5, 'green'), (6, 'White'), (7, 'YELLOW')]

使用collections.OrderedDict ,您可以構造一個有序映射,該映射仍然具有字典的優勢,例如O(1)查找。

from collections import OrderedDict

d = {'BLACK': 0, 'brown': 1, 'RED': 2, 'orange': 4, 'YELLOW': 7,
     'green': 5, 'BLUE': 4, 'violet': 2, 'GRAY': 3, 'White': 6}

od = OrderedDict(sorted(d.items(), key=lambda x: (x[1], x[0].casefold())))

print(od)

OrderedDict([('BLACK', 0), ('brown', 1), ('RED', 2), ('violet', 2), ('GRAY', 3),
             ('BLUE', 4), ('orange', 4), ('green', 5), ('White', 6), ('YELLOW', 7)])

由於您同時使用鍵和值進行排序,因此最好使用dict.items元組進行排序。 另外,使用str.casefold進行不區分大小寫的排序。

最后,請不要遮蔽諸如dict類的內置組件。 使用dict_d代替變量名。

暫無
暫無

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

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