在上一教程中,我们了解了Python Dictionaries ,并看到它们被视为具有key/value
对的无序集合,其中键用于访问与位置相对的项(例如在列表中)。
在这个快速提示中,我将向您展示如何将两个词典连接在一起(合并)。
Update()方法
假设我们有以下两个字典:
dict1 = {'bookA': 1, 'bookB': 2, 'bookC': 3}
dict2 = {'bookC': 2, 'bookD': 4, 'bookE': 5}
我们如何将这两个词典合并到一个字典中? 在这方面我们可以使用的功能是update([other])
。 如Python文档中所述:
使用来自其他的键/值对更新字典,覆盖现有键。
不返回None
。
update()
接受另一个字典对象或键/值对的可迭代(作为元组或其他长度为2的其他可迭代)。 如果指定了关键字参数,则将使用以下键/值对更新字典:d.update(red=1, blue=2)
。
因此,要合并以上两个字典,我们可以输入以下内容:
dict2.update(dict1)
假设您键入以下语句以查看结果:
print dict2.update(dict1)
在这种情况下,您将获得None
! 这是因为update()
函数不会返回新的字典。 为了获得串联的结果,只需键入以下内容:
print dict2
在这种情况下,您将获得以下输出:
{'bookA': 1, 'bookB': 2, 'bookC': 3, 'bookD': 4, 'bookE': 5}
如果我们执行以下操作怎么办?
dict1.update(dict2)
print dict1
在这种情况下,您将获得以下输出:
{'bookA': 1, 'bookB': 2, 'bookC': 2, 'bookD': 4, 'bookE': 5}
注意,在第一种情况下, dict2.update(dict1)
,我们使用dict2
中的键/值对更新字典dict1
,并覆盖所有现有键。 我们注意到,存在的键是'bookC'
,在这种情况下,它的值为3
,因为我们正在使用dict1
的键/值对进行dict1
。 在后一种情况下,这将是相反的,即dict1.update(dict2)
,其中我们使用dict1
中的键/值对更新字典dict2
。
但是,使用update()
合并两个字典存在一个问题。 问题在于可以修改原始词典。 换句话说,例如在第一种情况下dict2.update(dict1)
,可以修改dict2
的原始版本,在后一种情况下dict1.update(dict2)
可以修改dict1
的原始版本。 也就是说,如果您对保留需要更新的字典的原始版本不感兴趣,则可以使用update()
合并两个字典。 这里的原始版本是指保留密钥的值。
在一个表达式中合并两个字典
可以用来合并两个字典的另一种方法,可以在一个表达式中执行这样的任务,如下所示:
print dict(dict2, **dict1)
该语句的输出为:
{'bookA': 1, 'bookB': 2, 'bookC': 3, 'bookD': 4, 'bookE': 5}
因此, dict1
覆盖dict2
。 如果要dict2
覆盖dict1
,请输入:
print dict(dict1, **dict2)
在这种情况下,输出为:
{'bookA': 1, 'bookB': 2, 'bookC': 2, 'bookD': 4, 'bookE': 5}
保留关键价值
回到上一期保留键值的问题,我们如何在保留每本词典的原文的同时合并两个字典?
一种变通方法可以如下所示(从此StackOverflow线程的答案中获取):
from itertools import chain
from collections import defaultdict
dict1 = {'bookA': 1, 'bookB': 2, 'bookC': 3}
dict2 = {'bookC': 2, 'bookD': 4, 'bookE': 5}
dict3 = defaultdict(list)
for k, v in chain(dict1.items(), dict2.items()):
dict3[k].append(v)
for k, v in dict3.items():
print(k, v)
在这种情况下的输出将是:
('bookA', [1])
('bookB', [2])
('bookC', [3, 2])
('bookD', [4])
('bookE', [5])
因此,从这个快速技巧中可以看到,使用Python合并两个字典非常容易,如果我们想在每个字典中保留相同键的值,它将变得更加复杂。
学习Python
无论您是刚刚起步还是想学习新技能的经验丰富的程序员,都可以通过我们完整的python教程指南学习Python。
翻译自: https://code.tutsplus.com/tutorials/how-to-merge-two-python-dictionaries--cms-26230