根据值列表重新排序python中的字典

时间:2011-05-08 05:09:55

标签: python list sorting dictionary

让我们考虑一下字典:

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']

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

6 个答案:

答案 0 :(得分:4)

如果您正在使用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

答案 1 :(得分:2)

Python词典是无序的。

改为使用OrderedDict

答案 2 :(得分:2)

为您重新排序字典的含义是什么?字典本质上是无序数据结构 - 它们用于查找而不是 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的顺序将值插入其中。

答案 3 :(得分:1)

使用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中。

答案 4 :(得分:1)

  

Python 3.6及更高版本的答案

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

在这种情况下,可以根据desired_order_list中包含的项目通过简单的字典理解来构建新字典。

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'}

答案 5 :(得分:0)

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

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