簡體   English   中英

按清單上的項目順序對python字典進行排序

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

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