如何在Python中计算两个dict对象的并集,如果key的结果中存在一个(key, value)对,那么in是dict之一(除非存在重复)?
例如,{'a' : 0, 'b' : 1}和{'c' : 2}的联盟是{'a' : 0, 'b' : 1, 'c' : 2}。
最好不修改输入dict。有用的示例:获取当前作用域中所有变量及其值的dict
- @RikPoggi:另一个问题,尽管它的标题,是关于**d2语法是什么。它恰好为这个问题提供了一个答案。
这个问题提供了一个习语。使用其中一个dicts作为dict()构造函数的关键字参数:
在x中解析重复的值;例如
1
| dict({'a' : 'y[a]'}, **{'a', 'x[a]'}) == {'a' : 'x[a]'} |
- "简单总比复杂好。":)你应该使用update成员函数的dict。
- tmp = dict(y); tmp.update(x); do_something(tmp)如何更简单?
- 这并不复杂,这是Python dict结构的伟大使用。这与update不同(此解决方案不更新任何内容)。
- @lajarre:我同意,因为在这种情况下OP不想更新任何dict—这是基于现有dict创建一个新的dict的好方法。
- 它不"好",它是神秘的,它立即让大多数读者犹豫,其余的人假设x中的所有键都必须是合法的参数名。依我之见,它的工作原理是实现中的名称检查机制中的一个bug。当您依赖bug时会发生什么?它们要么被固定下来,要么在动员过程中变成政治足球。
- @JonJayObermark:同意。dict(x=2)可以,但是dict(4=2)不行。因此,如果x={4:2}该方法将失败。
- {**y, **x}不太冗长,可以接受任何类型的键,并且比使用临时dict的解决方案工作得更快。
- @Mechanicalsnail您说重复的值被解析为x中的值。这个习惯用法是否可以稍微修改一下,以便在y中保留x中缺失的键?因为现在他们被忽视了。
- dict(y, **x)和dict(**y, x)的顺序重要吗?
您还可以使用update的dict like方法
1 2 3 4 5
| a = {'a' : 0, 'b' : 1}
b = {'c' : 2}
a.update(b)
print a |
两本词典
1 2
| def union2(dict1, dict2):
return dict(list(dict1.items()) + list(dict2.items())) |
n字典
1 2
| def union(*dicts):
return dict(itertools.chain.from_iterable(dct.items() for dct in dicts)) |
- 或者更容易理解,dict(i for dct in dicts for i in dct.items())
- 为什么要转换为list() ?def union2(dict1, dict2): return dict(dict1.items() + dict2.items())
- @kinORnirvana In python3: a = {'x': 1};type(a.items()) =>
如果您需要保持两个词典的独立性和可更新性,您可以创建一个对象,该对象在其__getitem__方法中查询这两个词典(并根据需要实现get、__contains__和其他映射方法)。
一个极简主义的例子可能是这样的:
1 2 3 4 5 6 7
| 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] |
和它的工作原理:
1 2 3 4 5 6 7 8 9 10 11
| >>> 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
>>> |