在python 3.5中,我们可以使用double-splat解包来合并字典

>>> 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, {}),这看起来很丑陋。当该表达式似乎没有任何歧义时,为什么解析器不允许“一种明显的方法”?

最佳答案

这并非完全是您问题的答案,但我认为使用 ChainMap 是完成您提出的建议的惯用且优雅的方法(在线合并字典):

>>> from collections import ChainMap
>>> d1 = {1: 'one', 2: 'two'}
>>> d2 = {3: 'three'}
>>> ds = [d1, d2]
>>> dict(ChainMap(*ds))
{1: 'one', 2: 'two', 3: 'three'}

尽管这不是一个特别透明的解决方案,但是由于许多程序员可能并不确切知道ChainMap的工作方式。请注意(如@AnttiHaapala所指出的),“使用了首次发现”,因此,根据您的意图,您可能需要先将reversed传递给dict,然后再调用ChainMap
>>> d2 = {3: 'three', 2:'LOL'}
>>> dict(ChainMap(*ds))
{1: 'one', 2: 'two', 3: 'three'}

>>> dict(ChainMap(*reversed(ds)))
{1: 'one', 2: 'LOL', 3: 'three'}

关于python - 字典合并中的字典合并,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37584544/

10-16 16:22