2017-06-17 122 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]}}