在Python 3.5中,我们可以使用双星号解包来合并字典。
在Python 3.5中,我们可以使用双星号解包来合并字典。
>>> d1 = {1: 'one', 2: 'two'}
>>> d2 = {3: 'three'}
>>> {**d1, **d2}
{1: 'one', 2: 'two', 3: 'three'}
很酷。但似乎无法适用于动态使用情况:>>> ds = [d1, d2]
>>> {**d for d in ds}
SyntaxError: dict unpacking cannot be used in dict comprehension
相反,我们必须执行reduce(lambda x,y: {**x, **y}, ds, {})
,这看起来很丑陋。为什么解析器不允许“一种明显的方法”执行,当那个表达式似乎没有任何歧义?
some_function(*x for x in list_lists)
。解包星号不是真正的运算符,不能出现在表达式中。 - BrenBarn{k: v for d in [d1, d2] for k, v in d.items()}
是一个替代您的reduce()
的方法,虽然它看起来"比较丑",但仍然有效。 - Ilja Everilädict(ChainMap(d2, d1))
,但个人不太喜欢,因为谁知道什么是ChainMap
呢? - machine yearningChainMap(*ds)
本身似乎已经足够好了!不错,你应该将其作为答案添加进来。 - wim{**d for d in ds}
真的很好。 - Eric Duminil