使用另一个Python列表通过它的键对Python字典进行排序

时间:2017-07-16 18:06:22

标签: python list python-3.x sorting dictionary

我有list个字词:

['apple', 'zoo', 'chicken', 'needle', 'car', 'computer']

我还有一个dictionary,其中包含键和值:

{'zoo': 42, 'needle': 32, 'computer': 18, 'apple': 39, 'car': 11, 'chicken': 12}

dictionary的密钥全部来自list个字词。如何对dictionary进行排序,使其键的顺序与list中单词的顺序相同?因此,一旦排序,我的dictionary应如下所示:

{'apple': 39, 'zoo': 42, 'chicken': 12, 'needle': 32, 'car': 11, 'computer': 18}

非常感谢!

3 个答案:

答案 0 :(得分:3)

对于python版本< 3.6,字典不维护顺序,因此无法对字典进行排序。

您可以使用collections.OrderedDict按照您想要的顺序构建新词典:

In [269]: from collections import OrderedDict

In [270]: keys = ['apple', 'zoo', 'chicken', 'needle', 'car', 'computer']
     ...: dict_1 = {'zoo': 42, 'needle': 32, 'computer': 18, 'apple': 39, 'car': 11, 'chicken': 12}
     ...: 

In [271]: dict_2 = OrderedDict()

In [272]: for k in keys:
     ...:     dict_2[k] = dict_1[k]
     ...:     

In [273]: dict_2
Out[273]: 
OrderedDict([('apple', 39),
             ('zoo', 42),
             ('chicken', 12),
             ('needle', 32),
             ('car', 11),
             ('computer', 18)])

在Python3.6中,一个简单的字典理解就足够了:

>>> {x : dict_1[x] for x in keys}
{'apple': 39, 'zoo': 42, 'chicken': 12, 'needle': 32, 'car': 11, 'computer': 18}

答案 1 :(得分:1)

您可以使用OrderedDict,因为常规字典是无序的。对于您的情况,您可以这样做:

from collections import OrderedDict
od = OrderedDict()

ll = ['apple', 'zoo', 'chicken', 'needle', 'car', 'computer']
d = {'zoo': 42, 'needle': 32, 'computer': 18, 'apple': 39, 'car': 11, 'chicken': 12} 

for f in ll:
  od[f] = d[f]
#Outputs: OrderedDict([('apple', 39), ('zoo', 42), ('chicken', 12), ('needle', 32), ('car', 11), ('computer', 18)])

答案 2 :(得分:0)

默认情况下,Python dict不保留顺序,您应该使用collections.OrderedDict。您放入OrderedDict的第一个项目是您枚举它时会得到的第一个项目(例如使用for)。

from collections import OrderedDict

order_list = ['apple', 'zoo', 'chicken', 'needle', 'car', 'computer']
unordered_dict = {'zoo': 42, 'needle': 32, 'computer': 18, 'apple': 39, 'car': 11, 'chicken': 12}
ordered_dict = OrderedDict()
for item in order_list:
    ordered_dict[item] = unordered_dict[item]

for k, v in unordered_dict.items():
    print(k, v)

for k, v in ordered_dict.items():
    print(k, v)