我有一个像{'james': 32, 'jacob': 43, 'marie': 3}
这样的词典。
如果我有一个像['marie', 'jacob', 'james']
这样的列表,我如何对字典进行排序,以便新字典按照列表中项目的顺序排序?
即结果:
{'marie': 3, 'jacob': 43, 'james': 32}
答案 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] …