191

你如何计算dictPython 中两个对象的并集,如果(key, value)结果中存在一对,如果keyindict (除非有重复)?

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

最好您可以在不修改任一输入的情况下执行此操作dict。有用的示例:获取当前范围内所有变量及其值的字典

4

4 回答 4

150

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

dict(y, **x)

重复解决有利于x; 例如

dict({'a' : 'y[a]'}, **{'a', 'x[a]'}) == {'a' : 'x[a]'}
于 2012-03-22T09:37:17.293 回答
117

您也可以使用updatedict 的方法,例如

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

a.update(b)
print a
于 2012-03-22T09:54:27.030 回答
42

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

从 Python 3.9 开始,二进制“或”运算符|已被定义为连接字典。(急切地创建了一个新的具体字典):

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

对于动态字典组合,作为组合的实时字典的“视图”:

如果您需要两个字典保持独立且可更新,您可以创建一个对象,在其__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
>>> 

注意:如果想要懒惰地维护两个或多个字典的联合“视图”,请检查 collections.ChainMap标准库 - 因为它具有所有字典方法并涵盖上面示例中未考虑的极端情况。

于 2012-03-22T11:24:26.590 回答
36

两本词典

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

词典_

def union(*dicts):
    return dict(itertools.chain.from_iterable(dct.items() for dct in dicts))
于 2012-10-17T01:56:01.090 回答