2017-06-18 101 views
-3

下,例如有迪卡合并多个嵌套的字典相同的字典

dicA = {"01Feb":{"a":{"M1":[2,1,3,3], 
        "M2":[3,5,7,9], 
        "L3":[1,1,1,1] 
        }, 
      "b":{"M1":[2,4,8,1], 
       "M2":[1,1,2,0], 
       "L3":[3,4,6,8]} 
       }, 
    "02Feb":{"a":{"M1":[2,3,1,1], 
        "M2":[6,5,6,9] 
       }, 
      "b":{"M1":[2,4,8,1], 
        "M2":[1,1,2,0], 
        "L3":[3,4,6,8] 
        }, 
      "c":{"M1":[2,3,1,1], 
        "M2":[6,5,6,9], 
        "L3":[0,0,1,1]} 
        }, 
    "03Feb":{"a":{"M1":[3,3,3,3], 
        "M2":[5,5,7,7], 
        "L3":[3,3,3,3]} 
        }} 

这有点复杂,我的名单里面有相同的长度。 我想合并M1和M2为M,而只保留L3。它应该是这样的:

dicA = {{"01Feb":{"a":{"M":[5,6,10,12]},     
         {"L3":[1,1,1,1]}}, 
       {"b":{"M":[3,5,10,1]}, 
         {"L3":[3,4,6,8]}}}, 
     {"02Feb":{"a":{"M":[8,8,7,10]}}, 
       {"b":{"M":[3,5,10,1]}, 
         {"L3":[3,4,6,8]}}, 
       {"c":{"M":[8,8,7,10]}, 
         {"L3":[0,0,1,1]}}}, 
     {"03Feb":{"a":{"M":[8,8,10,10]}, 
         {"L3":[3,3,3,3]}}}} 

然后,我想合并'a','b'和'c'。它最终应该是这样的:

dicA = {{"01Feb":{"M":[8,11,20,13]},     
       {"L3":[4,5,7,9]}}, 
     {"02Feb":{"M":[19,21,24,21]}, 
       {"L3":[3,4,7,9]}}, 
     {"03Feb":{"M":[8,8,10,10]}, 
       {"L3":[3,3,3,3]}}} 
+0

你可以参考这个https://stackoverflow.com/a/44601474/5496463..it是相同的问题,但更简单。 – danche

+0

嗨,你到目前为止尝试过什么? –

+4

'dicA'无效:你不能有这样的符号'“a”:{“M1”:[2,1,3,3]}, {“M2”:[3,5,7,9]} , {“L3”:[1,1,1,1]}'in Python。不要改变你的输入 – RomanPerekhrest

回答

0

因为我之前发布过类似的问题,所以你们可能会认为这是同一个问题。其实这是一个不同的问题,需要合并多个嵌套字典与不同的键。注释中的link显示如何合并多个嵌套字典与相同键

这里是我的解决方案,在这种情况下合并这两种情况。

def merge(dictF): 

#create two new dict 
    M_12_merge ={} 
    abc_merge={} 
    for key in dictF: 
     M_12_merge[key]={} 
     abc_merge[key]={} 
    for key in dictF: 
     for subKey in dictF[key]: 
      M_12_merge[key][subKey]={} 

    for rekey in M_12_merge: 
     for sub_rekey in M_12_merge[rekey]: 
      M_12_merge[rekey][sub_rekey]['M']=[] 

# 1. merge sub_sub_key 'M1' and 'M2' under different keys 
    for key in dictF: 
     for sub_key in dictF[key]: 
      numberList=[] 
      for sub_sub_key in dictF[key][sub_key]: 
       if 'M' in sub_sub_key: 
        numberList.append(dictF[key][sub_key][sub_sub_key]) 
       else: 
        M_12_merge[key][subKey][sub_sub_key]=dictF[key][sub_key][sub_sub_key] 
      M_12_merge[key][sub_key]['M']=map(sum,zip(*numberList))  

# 2. merge sub_key 'a','b' and 'c' under same keys 
    for key in M_12_merge: 
     for sub_key in M_12_merge[key]: 
      for sub_sub_key in M_12_merge[key][sub_key]: 
       if sub_sub_key in abc_merge[key]: 
        abc_merge[key][sub_sub_key] = [sum(x) for x in zip(*[abc_merge[key][sub_sub_key], M_12_merge[key][sub_key][sub_sub_key]])] 
       else: 
        abc_merge[key][sub_sub_key] = M_12_merge[key][sub_key][sub_sub_key]     
    return abc_merge 


dic = merge(dicA) 
print(dic) 

感谢那些投下这个问题的人。希望这个解决方案能够帮助那些需要它的人。此外,任何新的想法都欢迎这种情况。

问候,

d