【问题标题】:Adding dictionaries together, Python [duplicate]将字典添加在一起,Python [重复]
【发布时间】:2011-08-25 16:37:24
【问题描述】:

我有两本词典,我希望能够将它们合二为一:

像这样的伪 Python 会很好:

dic0 = {'dic0': 0}
dic1 = {'dic1': 1}

ndic = dic0 + dic1
# ndic would equal {'dic0': 0, 'dic1': 1}

【问题讨论】:

  • @Sam 可能的问题:{'dic0':0} + {'dic0':1}。怎么办?
  • @palsch {'dic0':0} + {'dic0':1} 应该等价于 d={'dic0':0}; d.update({'dic0':1}) ?
  • 根据 PEP 584,自 Python 3.9 起支持您使用 + 运算符的语法

标签: python dictionary append


【解决方案1】:

如果您有兴趣在不使用中间存储的情况下创建新字典:(这比使用 dict.items() 更快,而且在我看来更干净)

dic2 = dict(dic0, **dic1)

或者,如果您愿意使用现有的字典之一:

dic0.update(dic1)

【讨论】:

  • 很好的答案,但很不直观。我希望实现“+”...
  • 如果键不是字符串,则第一行失败。
  • @BerryTsakala + 的问题是在发生冲突时会发生什么? .update() 完全不对称。
  • @BerryTsakala 你用 python 3.9 实现了你的愿望:) 但运营商是|,而不是+docs.python.org/3/whatsnew/3.9.html
【解决方案2】:

这里有很多添加字典的方法。

您可以使用 Python3 的字典解包功能。

ndic = {**dic0, **dic1}

或者通过添加两个项目来创建一个新的字典。

ndic = dict(dic0.items() + dic1.items())

如果您可以修改dic0

dic0.update(dic1)

如果你的可以修改dic0

ndic = dic0.copy()
ndic.update(dic1)

如果保证一个dict中的所有key都是字符串(在这种情况下dic1,当然可以交换args)

ndic = dict(dic0, **dic1)

在某些情况下,使用 dict 解析(Python 2.7 或更高版本)可能会很方便,
尤其是如果您想同时过滤或转换某些键/值。

ndic = {k: v for d in (dic0, dic1) for k, v in d.items()}

【讨论】:

    【解决方案3】:
    >>> dic0 = {'dic0':0}
    >>> dic1 = {'dic1':1}
    >>> ndic = dict(dic0.items() + dic1.items())
    >>> ndic
    {'dic0': 0, 'dic1': 1}
    >>>
    

    【讨论】:

    • 请注意,在 Python 3.x 中与此等效的语法是 ndic = list(dict(dic0.items()) + list(dic1.items())),因为 .items() 不再返回一个列表,而是一个(可迭代的)视图
    • @BryceGuinta 我猜你的意思是ndic = dict(list(dic0.items()) + list(dic1.items()))
    • @dimo414 是的,我的错。然而我现在不能改变它。我现在使用collections 中的ChainMap 通过dict(ChainMap(dic1, dic0)) 实现此功能。但是我不得不从the chainmap pypi package 获取 Python2.7 的源代码。请注意我是如何切换听写顺序的。在 Vijay 的示例中,最右边的键值会覆盖最左边的值,而 ChainMap 将其正确,并且最左边的键值优先于右边。
    【解决方案4】:

    您正在寻找update method

    dic0.update( dic1 )
    print( dic0 ) 
    

    给予

    {'dic0': 0, 'dic1': 1}
    

    【讨论】:

    • 很好,虽然它修改了 dic0。我不确定原始海报是否可以接受。
    【解决方案5】:
    dic0.update(dic1)
    

    请注意,这实际上并没有返回组合字典,它只是改变了dic0

    【讨论】:

      【解决方案6】:

      最简单的方法是简单地使用您的示例代码,但使用每个字典的 items() 成员。所以,代码是:

      dic0 = {'dic0': 0}
      dic1 = {'dic1': 1}
      dic2 = dict(dic0.items() + dic1.items())
      

      我在 IDLE 中对此进行了测试,它工作正常。 但是,关于这个主题的上一个问题指出,这种方法很慢并且会占用内存。那里推荐了其他几种方法,因此请查看内存使用是否很重要。

      【讨论】:

      • 仅供参考,这会创建一个元组列表,您需要运行 dict(dic0.items() + dic1.items())
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 2016-02-04
      • 2020-09-05
      • 1970-01-01
      • 2011-09-18
      相关资源
      最近更新 更多