2016-06-07 59 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