【问题标题】:Sort Python dictionary by it's keys using another Python list使用另一个 Python 列表按其键对 Python 字典进行排序
【发布时间】:2017-07-16 18:06:22
【问题描述】:

我有一个list 的单词:

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

我还有一个带有键和值的dictionary

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

我的dictionary的key都来自单词list。如何对dictionary 进行排序,使其键的顺序与list 中的单词顺序相同?所以排序后,我的dictionary 应该是这样的:

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

非常感谢!

【问题讨论】:

  • 字典不保留顺序。字典的可用排序版本是collections.OrderedDict
  • 首先您应该知道字典在 Python 3.5 及以下版本中是un排序的。对于有序词典,您可以使用collections.OrderedDict
  • @jmd_dk 请原谅我劫持了这个问题的评论部分,但是字典真的在 Python 3.6 中排序吗?看起来我当时错过了文档的那部分。 Nvm 找到了文档! :)
  • @ViníciusAguiar 他们确实是。我推荐这个精彩的演讲来概述最近(和历史)对字典的变化:youtube.com/watch?v=npw4s1QTmPg

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


【解决方案1】:

对于

您可以使用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 中,一个简单的 dict 理解就足够了:

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

【讨论】:

  • 太好了,行得通! (我使用的是 3.6)如果我的列表有我的字典没有的值怎么办?如何在不停止循环的情况下绕过 KeyError?
  • @QuantumJuker 您需要添加一个 if 条件:if k in dict_1: dict_2[k] = dict_1[k]
【解决方案2】:

您可以使用 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)])

【讨论】:

    【解决方案3】:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-08
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      • 2021-08-25
      相关资源
      最近更新 更多