2017-09-06 116 views
0

我有兩個字典列表,我試圖在一個唯一的鍵合併,但我不能得到我的頭如何處理這個問題。如何合併鍵上的兩個字典列表 - Python?

字典1:

A = {'1': [{'A': 'A_1', 'start': 'S'}, {'A': 'A_2', 'start': 'M'}], 
'2': [{'A': 'A_1', 'start': 'S'}, {'A': 'A_2', 'start': 'M'}]} 

字典2:

B = {'1': [{'l_1': 'www.l_1', 'l_2': 'www.l_2'}], 
'2': [{'l_1': 'www.myl_1', 'l_2': 'www.myl_2'}]} 

我想實現:

combined = {'1': [{'A': 'A_1', 'start': 'S', 'l_1': 'www.l_1', 'l_2': 'www.l_2'}, {'A': 'A_2', 'start': 'M', 'l_1': 'www.l_1', 'l_2': 'www.l_2'}], 
'2': [{'A': 'A_1', 'start': 'S', 'l_1': 'www.myl_1', 'l_2': 'www.myl_2'}, {'A': 'A_2', 'start': 'M', 'l_1': 'www.myl_1', 'l_2': 'www.myl_2'}]} 

下面是我迄今編寫的代碼。但它沒有提供我想要的結果..

from itertools import chain 
from collections import defaultdict 

dict3 = defaultdict(list) 
for k, v in chain(A.items(), B.items()): 
    dict3[k].append(v) 

print(dict3) 
+0

我在此刻有點忙,但看看'dict.update'做了很多的工作,散裝,而不是每一個關鍵迭代的。 – codykochmann

回答

1

您可以使用itertools.product從對應的鍵合併字典值,然後使用Python 3的字典合併語法:

from itertools import product 

dct = {k: [{**d1, **d2} for d1, d2 in product(v, B[k])] 
              for k, v in A.items()} 

在Python 2,您可以從產品的元組應用的理解,並建立一個合併字典從要素:

dct = {key: [{k: v for d in tup for k, v in d.items()} 
        for tup in product(val, B[key])] 
           for key, val in A.items()} 

{'1': [{'A': 'A_1', 'l_1': 'www.l_1', 'l_2': 'www.l_2', 'start': 'S'}, 
     {'A': 'A_2', 'l_1': 'www.l_1', 'l_2': 'www.l_2', 'start': 'M'}], 
'2': [{'A': 'A_1', 'l_1': 'www.myl_1', 'l_2': 'www.myl_2', 'start': 'S'}, 
     {'A': 'A_2', 'l_1': 'www.myl_1', 'l_2': 'www.myl_2', 'start': 'M'}]} 
+1

真的很感謝你的回答! –

0
for i in a: 
    if i in b: 

     for j in range(min(len(a[i]),len(b[i]))): 
      a[i][j]=dict(a[i][j].items()+b[i][j].items()) #re-assign after combining 

     if len(b[i])>len(a[i]):  # length case 
      for j in range(len(a[i]),len(b[i])): 
        a[i].append(b[i][j]) 

for i in b:   # if not in a 
    if i not in a: 
    a[i]=b[i] 
print a 
相關問題