【问题标题】:How can I merge two Python dictionaries additive? [duplicate]如何合并两个 Python 字典加法? [复制]
【发布时间】:2016-06-07 20:12:17
【问题描述】:

我想合并两个 Python 字典加法,像这样:

 a = {'result': {'sessionId': '111'}}
 b = {'result': {'completelyOtherSessionId': '100'}}
 ##magic##
 c = {'result': {'sessionId': '111', 'completelyOtherSessionId': '100'}}

【问题讨论】:

  • 我看到键 sessionIdsessionsId 略有不同。这是故意的吗?
  • 您是否查看过单页文档或有关 python 字典的文档?你用谷歌搜索过“python 合并字典”吗?
  • 当然!但我能找到的只是 dict.update(otherdict) 函数......

标签: python python-3.x dictionary


【解决方案1】:
>>> a = {'result': {'sessionId': '111'}}
>>> b = {'result': {'sessionsId': '100'}}
>>> с = a.copy()
>>> for key in c:
>>>     c[key].update(b[key])
>>> print(c)
{'result': {'sessionId': '111', 'sessionsId': '100'}}

请理解,此解决方案仅适用于您的特定情况(ab 的值也是字典)。否则,update 方法将不可用,并且您会得到 AttributeError 异常。

【讨论】:

  • 这对我的问题来说是一个很好的解决方案。有了这个,我可以编写一个通用函数。但它有点令人困惑,我是唯一一个有这个问题的人......
【解决方案2】:

这是一个 Python2/3 函数,它不会改变你给它的 dicts。它将创建一个新的并尝试将它们全部结合起来。请记住,它不会以任何高级方式处理碰撞。它只是用最右边的 dict 参数覆盖它。

def add_dicts(*dicts):
    ret, dicts = dict(), list(dicts)
    dicts.insert(0, ret)
    try:
        red = reduce
    except NameError:
        red = __import__("functools").reduce
    red(lambda x, y: x.update(y) or x, dicts)
    return ret

例子:

a = {"a": 1}
b = {"b": 2}
c = {"c": 3}

var = add_dicts(a, b, c)
print(a)  # => {"a": 1}
print(b)  # => {"b": 2}
print(c)  # => {"c": 3}
print(var)  # => {'a': 1, 'c': 3, 'b': 2}

【讨论】:

  • 时髦的导入是怎么回事?为什么不from functools import reduce as red
  • 没有特别的原因。 PyCharm 不喜欢我在整个代码中都有导入。使用__import__ 语句,您不会真正失去任何东西。
  • 谢谢,但是你写的函数在结果中与 dict.update(otherdict) 函数非常相似。
  • 除了它需要任意数量的字典而不是手动执行它们并且它返回一个新的字典,这意味着原始字典保持不变。
  • @Goodies 您的解决方案不能解决 OP 的问题。函数 add_dicts(a, b) 不会返回 OP 期望的 c
猜你喜欢
  • 1970-01-01
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 2013-04-17
  • 2012-09-12
  • 2022-12-18
  • 1970-01-01
相关资源
最近更新 更多