[英]Sort a python dictionary by order of items on list
我有一本類似{'james': 32, 'jacob': 43, 'marie': 3}
的字典。
假設我有一個類似['marie', 'jacob', 'james']
的列表,我該如何對字典進行排序,以便新字典將按列表中項目的順序進行排序?
即結果:
{'marie': 3, 'jacob': 43, 'james': 32}
您無法對字典進行排序,但可以在此處使用collections.OrderedDict
:
>>> from collections import OrderedDict
>>> from operator import itemgetter
>>> lst = ['marie', 'jacob', 'james']
>>> d = {'james': 32, 'jacob': 43, 'marie': 3}
>>> OrderedDict(zip(lst, itemgetter(*lst)(d)))
OrderedDict([('marie', 3), ('jacob', 43), ('james', 32)])
正如“未定義的不是函數”所寫,字典不進行排序(盡管顧名思義),而collections.OrderedDict
則是collections.OrderedDict
字典。
不過,我將以一種更清晰的方式(僅使用基本的Python)編寫解決方案:
>>> from collections import OrderedDict
>>> names = ['marie', 'jacob', 'james']
>>> my_dict = {'james': 32, 'jacob': 43, 'marie': 3}
>>> OrderedDict((name, my_dict[name]) for name in names)
OrderedDict([('marie', 3), ('jacob', 43), ('james', 32)])
該解決方案還比“未定義不是函數”的zip()
方法占用更少的內存,因為沒有構造中間列表(在Python 2中)(在一般情況下,這可能很重要),盡管可以通過以下方法進行補救:用itertools.izip()
替換zip()
,但是當Python可以像這種解決方案一樣,以一種清晰明了的方式完美地處理問題時, itemgetter()
解決方案將變得更加沉重(帶有兩個額外的導入)。
正如Aleksander Lidtke所提到的,也許您不需要首先創建一個新的,排序的字典。 也許在名稱上循環就足夠了:
for name in names:
… my_dict[name] …
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.