按列表中的项目顺序对python字典进行排序

时间:2014-07-27 21:45:54

标签: python list dictionary

我有一个像{'james': 32, 'jacob': 43, 'marie': 3}这样的词典。

如果我有一个像['marie', 'jacob', 'james']这样的列表,我如何对字典进行排序,以便新字典按照列表中项目的顺序排序?

即结果:

{'marie': 3, 'jacob': 43, 'james': 32}

2 个答案:

答案 0 :(得分:3)

您无法对字典进行排序,但可以在此处使用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)])

答案 1 :(得分:1)

由于“未定义不是函数”写的,字典没有排序(尽管他们的名字暗示),但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中) - 在一般情况下可能很重要 - 尽管这样可以通过用zip()替换itertools.izip()来解决这个问题,但是这会使itemgetter()解决方案变得更重(有两个额外的导入),而Python可以像这个解决方案一样,完美地处理问题直接而且明确地。

正如Aleksander Lidtke所提到的,也许你不需要首先创建一个新的,排序的字典。也许在名字上循环就足够了:

for name in names:
    … my_dict[name] …