Python中的dict对象联合

Mec*_*ail 114 python dictionary associative-array idioms set-operations

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

例如,{'a' : 0, 'b' : 1}{'c' : 2}的结合{'a' : 0, 'b' : 1, 'c' : 2}.

您最好不要修改任何输入dict.这有用的示例:获取当前范围内所有变量及其值的字典

Mec*_*ail 98

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

dict(y, **x)
Run Code Online (Sandbox Code Playgroud)

解决重复项以支持其中的值x; 例如

dict({'a' : 'y[a]'}, **{'a', 'x[a]'}) == {'a' : 'x[a]'}
Run Code Online (Sandbox Code Playgroud)

  • 如何`tmp = dict(y); tmp.update(X); do_something(tmp)`更简单? (17认同)
  • 它不是'好',它是神秘的,它立即使大多数读者犹豫不决,其余的假设x中的所有键都必须是合法的参数名称.恕我直言,它的工作原理是实现中的名称检查机制中的一个错误.当你依赖bug时会发生什么?他们要么得到修复,要么成为PEP过程中的政治足球. (13认同)
  • "简单比复杂更好." :)你应该使用`dict`的`update`成员函数. (11认同)
  • @shahjapan这并不复杂,这是很好用的Python dict结构.这与更新不同(此解决方案不会更新任何内容). (7认同)
  • @JonJayObermark:同意.`dict(x = 2)`没关系,但`dict(4 = 2)`不是.因此,如果`x = {4:2}`,建议的方法将失败. (6认同)
  • @lajarre:我同意,因为在这种情况下OP不想更新任何dicts - 它是一种基于现有dicts创建新的`dict`的好方法. (3认同)
  • 这个答案已经过时,有时会在 Python 3 中失败。请不要像我一样浪费时间,而是查看重复问题中的规范答案:/sf/ask/2729121/ -在Python中的单个表达式中合并两个字典 (3认同)
  • `{**y, **x}` 不那么冗长,接受任何类型的键并且比使用临时字典的解决方案工作得更快。 (2认同)

Nil*_*esh 84

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

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

a.update(b)
print a
Run Code Online (Sandbox Code Playgroud)

  • 请注意,“.update”更改了“a”。有时候,这是无法接受的 (3认同)
  • 执行“{**d1,**d2}”。有关详细信息,请参阅:/sf/ask/2729121/ (3认同)

Mat*_*ose 26

两本词典

def union2(dict1, dict2):
    return dict(list(dict1.items()) + list(dict2.items()))
Run Code Online (Sandbox Code Playgroud)

n字典

def union(*dicts):
    return dict(itertools.chain.from_iterable(dct.items() for dct in dicts))
Run Code Online (Sandbox Code Playgroud)

  • 或者更可读的是,`dict(我在dct.items()中用于dct in dts) (15认同)
  • @kinORnirvana在python 3中:a = {'x':1}; type(a.items())=> <class'dict_items'> (2认同)

jsb*_*eno 8

如果您需要两个dicts保持独立和可更新,您可以创建一个单独的对象,在其__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]
Run Code Online (Sandbox Code Playgroud)

它有效:

>>> 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
>>> 
Run Code Online (Sandbox Code Playgroud)