字典合并中的字典合并

发布于 2021-01-29 15:24:13

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

关注者
0
被浏览
239
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这并不是您所提问题的确切答案,但我认为使用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'}
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看