根据值列表重新排序Python字典

34 投票
8 回答
49786 浏览
提问于 2025-04-16 17:13

让我们考虑一个字典:

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

撰写回答