[英]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.