2017-06-17 269 views
3

下,比如我有一本字典:如何合併兩個嵌套的字典相同的字典

dictA={"nest1":{"01feb":[1,2,3,4,5],"02feb":[1,7,8,9,10]}, 
     "nest2":{"01feb":[1,2,3,4,5],"02feb":[6,4,8,10,10]}} 

名單內具有相同的長度。我需要nest1nest2合併爲一個字典,結果應該是這樣的:

dictA={"nest":{"01feb":[2,4,6,8,10],"02feb":[7,11,16,19,20]}} 

回答

1

普萊舍找到您所查詢下面的代碼。

dictA={"nest1":{"01feb":[1,2,3,4,5],"02feb":[1,7,8,9,10]}, 
     "nest2":{"01feb":[1,2,3,4,5],"02feb":[6,4,8,10,10]}} 
result ={} 
final_op = {} 
for k,v in dictA.iteritems(): 
    for nk,nv in v.iteritems(): 
     if result.has_key(nk): 
      i=0 
      while i < len(result[nk]): 
       result[nk][i] += nv[i] 
       i += 1 
     else: 
      result[nk] = nv 
final_op['nest'] = result 
print final_op 

輸出:

{'nest': {'02feb': [7, 11, 16, 19, 20], '01feb': [2, 4, 6, 8, 10]}} 
+0

感謝您的回答!我試過你的代碼,這正是我在我的應用程序中需要的。非常感謝。 –

1

您必須遍歷字典並更新迭代的值。

dictA={"nest1":{"01feb":[1,2,3,4,5],"02feb":[1,7,8,9,10]}, 
     "nest2":{"01feb":[1,2,3,4,5],"02feb":[6,4,8,10,10]}} 

def merge(dictA): 
    merge_dict = {} 
    for key in dictA: 
     for sub_key in dictA[key]: 
      if sub_key in merge_dict: 
       # update the nested value 
       merge_dict[sub_key] = [sum(x) for x in zip(*[merge_dict[sub_key], dictA[key][sub_key]])] 
      else: 
       merge_dict[sub_key] = dictA[key][sub_key] 
    return merge_dict 

merge_dict = merge(dictA) 
dictA.clear() 
dictA["nest"] = merge_dict 

print(dictA) 
+0

非常感謝您的想法,這真的是蟒蛇。我一定會給你一個!雖然我只能給一個答案接受,我的朋友。 –

+0

我的榮幸。沒關係:-) – danche

1

這裏是做你問一個函數:

def merge_nested(dictionary): 
    result = dict() 
    for nested in dictionary.values(): 
     for key in nested.keys(): 
      if key in result: 
       # We've already found it, add our values to it's 
       for i in range(len(result[key])): 
        result[key][i] += nested[key][i] 
      else: 
       result[key] = nested[key] 
    return {"nest":result} 

有了這個功能,您將獲得以下輸出:

>>> print(merge_nested({"nest1":{"01feb":[1,2,3,4,5],"02feb":[1,7,8,9,10]},"nest2":{"01feb":[1,2,3,4,5],"02feb":[6,4,8,10,10]}})) 
{'nest': {'01feb': [2, 4, 6, 8, 10], '02feb': [7, 11, 16, 19, 20]}} 

這是修改後的版本@ Arockia的回答here

+0

謝謝你的這個新想法! –

4

您可以使用dict comprehension,map()zip()就像這個例子(適用於Python 2和Python 3)。

dictA = {'nest1': {'01feb': [1, 2, 3, 4, 5], '02feb': [1, 7, 8, 9, 10]}, 
'nest2': {'01feb': [1, 2, 3, 4, 5], '02feb': [6, 4, 8, 10, 10]}} 

a = (v.items() for _, v in map(list, dictA.items())) 
# You can also use another map(): 
# final = {'nest': {k: list(map(sum, zip(v,j))) for (k, v), (_, j) in zip(*a)}} 
final = {'nest': {k: [m+n for m, n in zip(v, j)] for (k, v), (_, j) in zip(*a)}} 

print(final) 

輸出:

{'nest': {'02feb': [7, 11, 16, 19, 20], '01feb': [2, 4, 6, 8, 10]}} 
+1

這應該是最好的答案,謝謝你的pythonic方式! –

+0

如果需要,也可以在一行中完成。乾杯和快樂的編碼:) –

+1

這需要'dictA'準確地有兩個鍵。它打破了字典中更少或更多的條目。 –

1

groupbyitertools的解決方案:

from itertools import chain, groupby 
import operator 

dictA={"nest1":{"01feb":[1,2,3,4,5],"02feb":[1,7,8,9,10]}, 
     "nest2":{"01feb":[1,2,3,4,5],"02feb":[6,4,8,10,10]}} 

A = { 
    "nest": dict(
     (key, list(map(operator.add, *(v for _, v in group)))) 
     for key, group in groupby(
      sorted(
       chain(*(v.iteritems() for v in dictA.values())) # Python 2 
       # chain(*(v.items() for v in dictA.values())) # Python 3 
      ), 
      lambda x: x[0], 
     ) 
    ) 
} 

print(A) 

結果:

{'nest': {'02feb': [7, 11, 16, 19, 20], '01feb': [2, 4, 6, 8, 10]}}