如何将有序字典的键更改为 Python 中其他有序字典的键?

How to change keys of ordered dict to that of keys from other ordered dict in Python?

我有两个有序的字典 D1D2。我想将 D2 的键名分配给 D1(覆盖 D1 的现有键名)。怎么做?

示例:

D1 = {'first_key': 10, 'second_key': 20}
D2 = {'first_new_key': 123, 'second_new_key': 456}

现在我想将 D2 的键名分配给 D1,这样 D1 就变成了

{'first_new_key': 10, 'second_new_key': 20}

这是一个解决方案:

keys = D2.keys()
values = D1.values()
new_dict = dict(zip(keys, values))

如果您喜欢 1 线(这就是我们 python 的原因,对吧?):

new_dict = dict(zip(D2.keys(), D1.values()))

如评论中所述,2个词典之间的插入顺序必须匹配。

编辑

我发现你想覆盖 D1。在那种情况下,你可以简单地做:

D1 = dict(zip(D2.keys(), D1.values()))

编辑 2

正如 Barmar 在另一个答案中提到的,为了订购词典,必须使用 collections.OrderedDict()

最简单的方法就是字典赋值:

D1 = {'first_key': 10, 'second_key': 20}
D2 = {'first_new_key': 123, 'second_new_key': 456}
D2['first_new_key'] = D1['first_key']
D2['second_new_key'] = D1['second_key']

然而,对于更大的词典,使用词典理解可能会更好:

D1 = {a:D1[a.split('_')[0]+"_key"] for a, _ in D2.items()}

输出:

{'second_new_key': 20, 'first_new_key': 10}

如果可以创建新词典,noamgot 的答案将有效。如果需要就地修改现有字典:

for (old_key, old_val), new_key in zip(list(D1.items()), D2.keys()):
    del D1[old_key]
    D1[new_key] = old_val

list() 包装器在 Python 3 中是必需的,因为 items() 是一个生成器,你不能修改被迭代的字典。

DEMO