Python中dict对象的联合

在Python中如何计算两个dict对象的并集,其中(key, value)对出现在keyin either dict的结果中(除非有重复项)?

例如,{'a' : 0, 'b' : 1}{'c' : 2}的并集是{'a' : 0, 'b' : 1, 'c' : 2}

最好你可以在不修改任何输入dict的情况下做到这一点。这个有用的例子:获取当前范围内所有变量及其值的字典

120844 次浏览

这个问题提供了一个习语。使用其中一个dicts作为dict()构造函数的关键字参数:

dict(y, **x)

重复项将被解析为有利于x中的值;例如

dict({'a' : 'y[a]'}, **{'a', 'x[a]'}) == {'a' : 'x[a]'}

你也可以使用dict like的update方法

a = {'a' : 0, 'b' : 1}
b = {'c' : 2}


a.update(b)
print a

对于静态字典,组合其他字典的快照:

从Python 3.9开始,二进制的"or"操作符|被定义为连接字典。(一个新的、具体的字典被急切地创建出来):

>>> a = {"a":1}
>>> b = {"b":2}
>>> a|b
{'a': 1, 'b': 2}

相反,|=扩展赋值已被实现,其含义与调用update方法相同:

>>> a = {"a":1}
>>> a |= {"b": 2}
>>> a
{'a': 1, 'b': 2}

详情请查看pep - 584

在Python 3.9之前,创建新字典的更简单的方法是使用“星形扩展”来创建新字典。将每个子字典的内容添加到位:

c = {**a, **b}

对于动态字典组合,工作为"view"结合,活字典:

如果你需要这两个字典保持独立且可更新,你可以创建一个对象,在它的__getitem__方法中查询这两个字典(并在需要时实现get__contains__和其他映射方法)。

一个极简主义的例子可以是这样的:

class UDict(object):
def __init__(self, d1, d2):
self.d1, self.d2 = d1, d2
def __getitem__(self, item):
if item in self.d1:
return self.d1[item]
return self.d2[item]

它是有效的:

>>> a = UDict({1:1}, {2:2})
>>> a[2]
2
>>> a[1]
1
>>> a[3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 7, in __getitem__
KeyError: 3
>>>

:如果一个人想懒惰地维护一个Union "view"两个 或更多字典,在标准库中检查collections.ChainMap -因为它有所有的字典方法,不覆盖角落的情况

.

.

.

两本词典

def union2(dict1, dict2):
return dict(list(dict1.items()) + list(dict2.items()))

< em > n < / em >字典

def union(*dicts):
return dict(itertools.chain.from_iterable(dct.items() for dct in dicts))