2016-06-07 53 views
0

我想合并两个Python字典添加剂,像这样:如何合并两个Python字典添加剂?

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

我看到的按键'sessionId'和'sessionsId'略有不同。那是故意的吗? –

+0

您是否看过单页文档或有关python字典的内容?你用Google搜索“python merge dictionaries”吗? –

+0

当然!但所有我能找到的是dict.update(otherdict)函数... – knurzl

回答

0

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

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} 
+0

什么是时髦的进口?为什么不从** functools导入减少为红色**? –

+0

没有特别原因。当我在我的代码中导入时,PyCharm不喜欢。用'__import__'语句,你不会真的失去任何东西。 – Goodies

+0

谢谢,但是你写的函数与dict.update(otherdict)函数的结果非常相似。 – knurzl

2
>>> 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异常。

+0

这是我的问题的一个很好的解决方案。有了这个我可以写出一个通用的功能。但它有点混淆,即时通讯这个问题的唯一一个... – knurzl