【问题标题】:Reorder dictionary in python according to a list of values根据值列表重新排序python中的字典
【发布时间】:2011-08-21 00:13:56
【问题描述】:

让我们考虑一个字典:

sample_dict={1:'r099',2:'g444',3:'t555',4:'f444',5:'h666'}

我想按照包含我想要的字典键顺序的列表指定的顺序重新排序该字典。假设所需的订单列表是:

desired_order_list=[5,2,4,3,1]

所以,我希望我的字典看起来像这样:

{5:'h666',2:'g444',4:'f444',3:'t555',1:'r099'}

如果我能得到一个值列表也很好。意思是,结果可能是这样的:

['h666','g444','f444','t555','r099']

如何以最简单的方式实现这一目标?

【问题讨论】:

  • 你真的在使用collections.OrderedDict吗?
  • 我应该使用这样的东西吗:OrderedDict(sorted(sample_dict.items(), key=lambda t: [5,2,4,3,1])

标签: python list sorting dictionary


【解决方案1】:

Python 3.6+ 的答案

Guido 已保证字典将从 Python 3.7 开始订购,并且它们已经作为 3.6 中的实验性功能。答案已在Fastest way to sort a python 3.7+ dictionary 中展开。

在这种情况下,基于 desired_order_list 中包含的项目构建一个具有简单字典理解的新 dict 即可。

sample_dict = {1: 'r099', 2: 'g444', 3: 't555', 4: 'f444', 5: 'h666'}
print(sample_dict)
>>> {1: 'r099', 2: 'g444', 3: 't555', 4: 'f444', 5: 'h666'}

desired_order_list = [5, 2, 4, 3, 1]

reordered_dict = {k: sample_dict[k] for k in desired_order_list}
print(reordered_dict)
>>> {5: 'h666', 2: 'g444', 4: 'f444', 3: 't555', 1: 'r099'}

【讨论】:

    【解决方案2】:

    如果您使用的是OrderedDict,您可以这样做

    for key in [5,2,4,3,1]:
        my_ordered_dict[key] = my_ordered_dict.pop(key)
    

    这会按照您想要的顺序重新插入有序字典中的所有内容,以便稍后您可以这样做

    my_ordered_dict.values()
    

    并获取您在问题中建议的列表。

    如果您将重新插入包装在 try: ...; except KeyError: pass 中,您可以重新排序 OrderedDict,即使您的列表中并非所有键都存在。

    【讨论】:

      【解决方案3】:

      Python 字典是无序的。

      请改用OrderedDict

      【讨论】:

      • 好的,但我如何按特定顺序重新排序?
      【解决方案4】:

      使用 OrderedDict 或 Eli's solution 可能是一个不错的方法,但作为参考,这里提供了一种获取所需值列表的简单方法:

      [sample_dict[k] for k in desired_order_list]
      

      如果您不能完全确定 desired_order_list 中的每个元素都会成为 sample_dict 中的键,请使用 [sample_dict.get(k) ...][... for k in desired_order_list if k in sample_dict]。第一种方法将 None 放入缺少的键,第二种方法将只包含来自键的值在 dict 中。

      【讨论】:

        【解决方案5】:

        对你来说重新排序字典的意义是什么?字典本质上是无序的数据结构——它们用于查找而不是order

        您想以特定顺序遍历字典吗?然后就用你的desired_order_list:

        for key in desired_order_list: 
          # d is the dictionary
          # do stuff with d[key]
        

        正如其他人所提到的,Python 有一个OrderedDict(在 2.7 或 3.x 中),但我认为这不是你需要的。 “重新排序”效率太低了。最好将字典和键列表按所需顺序放在一起。

        如果你仍然坚持OrderedDict,只需创建一个新的OrderedDict,将值按desired_order_list的顺序插入其中。

        【讨论】:

          【解决方案6】:

          使用 django 提供的SortedDict (from django.utils.datastructures import SortedDict)。 SortedDict 将其顺序存储在 keyOrder 属性中(这只是一个列表,因此您可以随时以任何您喜欢的方式重新排序)。

          如果你没有安装 django 或者没有使用 django,只需解除实现 django.utils.datatstructures。它不依赖于 django 的任何其他部分。

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-07
          • 2023-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多