根据值列表重新排序Python字典
让我们考虑一个字典:
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']
我该如何以最简单的方式实现这个目标呢?
8 个回答
5
现有的回答已经很全面了,除了一个特殊情况,就是当列表不完整时,我们想要保留所有的值,并把其他的值放到最后。这时,在创建字典之后,更新它,用旧的字典来添加缺失的值:
sample_dict = {1: 'r099', 2: 'g444', 3: 't555', 4: 'f444', 5: 'h666'}
print(reordered_dict)
# {1: 'r099', 2: 'g444', 3: 't555', 4: 'f444', 5: 'h666'}
desired_order_list = [5, 2 ]
reordered_dict = {k: sample_dict[k] for k in desired_order_list}
print(reordered_dict)
# {5: 'h666', 2: 'g444'}
reordered_dict.update(sample_dict)
print(reordered_dict)
# {5: 'h666', 2: 'g444', 1: 'r099', 3: 't555', 4: 'f444'}
11
如果你在使用一个 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
。
41
适用于 Python 3.6 及以上版本的回答
Guido(Python 的创始人)已经确认,从 Python 3.7 开始,字典的顺序是有保证的,而在 3.6 版本中,这个特性已经作为实验功能存在了。关于这个问题的详细解答,可以参考 如何快速排序 Python 3.7 及以上版本的字典。
在这种情况下,可以通过简单的字典推导式,根据 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'}