簡體   English   中英

Python 3 按其值對 dict 進行排序

[英]Python 3 sort a dict by its values

我發現的唯一方法適用於 python2 或只返回元組列表。

是否可以按值對字典進行排序,例如{"aa": 3, "bb": 4, "cc": 2, "dd": 1}

我想要實現的排序字典的順序是從大到小。 我希望結果如下所示:

bb 4
aa 3
cc 2
dd 1

排序后我想將它存儲到一個文本文件中。

itemgetter (請參閱其他答案)(據我所知)對於大型詞典更有效,但對於常見情況,我相信d.get獲勝。 而且它不需要額外的import

>>> d = {"aa": 3, "bb": 4, "cc": 2, "dd": 1}
>>> for k in sorted(d, key=d.get, reverse=True):
...     k, d[k]
...
('bb', 4)
('aa', 3)
('cc', 2)
('dd', 1)

請注意,您也可以將d.__getitem__設置為key函數,這可能會比d.get提供小的性能提升。

from collections import OrderedDict
from operator import itemgetter    

d = {"aa": 3, "bb": 4, "cc": 2, "dd": 1}
print(OrderedDict(sorted(d.items(), key = itemgetter(1), reverse = True)))

版畫

OrderedDict([('bb', 4), ('aa', 3), ('cc', 2), ('dd', 1)])

雖然從你的最后一句話來看,元組列表似乎可以正常工作,例如

from operator import itemgetter  

d = {"aa": 3, "bb": 4, "cc": 2, "dd": 1}
for key, value in sorted(d.items(), key = itemgetter(1), reverse = True):
    print(key, value)

哪個打印

bb 4
aa 3
cc 2
dd 1

您可以使用字典理解相反的順序(從大到小)對進行排序:

{k: d[k] for k in sorted(d, key=d.get, reverse=True)}
# {'b': 4, 'a': 3, 'c': 2, 'd': 1}

如果要按升序(從小到大)按排序

{k: d[k] for k in sorted(d, key=d.get)}
# {'d': 1, 'c': 2, 'a': 3, 'b': 4}

如果要按鍵升序排序

{k: d[k] for k in sorted(d)}
# {'a': 3, 'b': 4, 'c': 2, 'd': 1}

這適用於 CPython 3.6+ 和 Python 3.7+ 的任何實現,因為字典保持插入順序。

另一種方法是使用 lambda 表達式。 根據解釋器版本以及您是否希望創建排序字典或排序鍵值元組(如 OP 所做的那樣),這甚至可能比接受的答案更快。

d = {'aa': 3, 'bb': 4, 'cc': 2, 'dd': 1}
s = sorted(d.items(), key=lambda x: x[1], reverse=True)

for k, v in s:
    print(k, v)

要對字典進行排序,我們可以使用 operator 模塊。 是操作員模塊文檔。

import operator                             #Importing operator module
dc =  {"aa": 3, "bb": 4, "cc": 2, "dd": 1}  #Dictionary to be sorted

dc_sort = sorted(dc.items(),key = operator.itemgetter(1),reverse = True)
print dc_sort

輸出序列將是一個排序列表:

[('bb', 4), ('aa', 3), ('cc', 2), ('dd', 1)]

如果我們想根據鍵進行排序,我們可以利用

dc_sort = sorted(dc.items(),key = operator.itemgetter(0),reverse = True)

輸出序列將是:

[('dd', 1), ('cc', 2), ('bb', 4), ('aa', 3)]

要對字典進行排序並在之后保持它作為字典的功能,您可以使用標准庫中的OrderedDict

如果這不是您所需要的,那么我鼓勵您重新考慮給您留下元組列表的排序函數。 如果不是鍵值對(元組)的有序列表,您想要什么輸出?

暫無
暫無

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

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