2017-10-13 132 views
0

我有字典的兩個列表的列表作爲示出的示例在下面合併嵌套詞典

list1=[ 
     { 
      "pdpData":{ 
       "a":1, 
       "b":2 
      } 
     } 
    ] 

list2=[ 
    { 
     "pdpData":{ 
      "a":1, 
      "c":3 
     } 
    }, 
    { 
     "pdpData":{ 
      "a":2, 
      "b":3 
     } 
    } 
] 

我想所示的格式下面

list3=[ 
{ 
    "pdpData":{ 
     "a":1, 
     "b":2, 
     "c":3 
    } 
}, 
{ 
    "pdpData":{ 
     "a":2, 
     "b":3 
    } 
} 
] 

list1的和list2中的大小的結果可能在10000年。 List3將是list1和list2的聯合。什麼是解決這個問題的最好的pythonic解決方案。

+0

試試這個https://stackoverflow.com/questions/19561707/python-merge-two-lists-of-dictionaries –

+0

你怎麼 「聯盟」 的名單時,他們有「萬分之一」的元素?你想結合每一對口銜,即產品,結果列表3中有10,000?= 100,000,000字?或者你總是將list1中的所有字典合併到list2中的所有字典中,從而導致list3中只有10,000個字符?你應該提供更多的解釋和/或例子。 –

+0

您可能需要重新閱讀[問]和[mcve]。 – boardrider

回答

1

你沒有寫任何代碼,所以我不會寫一個完整的解決方案。您需要zip_longestdict merging

from itertools import zip_longest 

list1=[ 
     { 
      "pdpData":{ 
       "a":1, 
       "b":2 
      } 
     } 
    ] 

list2=[ 
    { 
     "pdpData":{ 
      "a":1, 
      "c":3 
     } 
    }, 
    { 
     "pdpData":{ 
      "a":2, 
      "b":3 
     } 
    } 
] 


for d1, d2 in zip_longest(list1, list2): 
    dd1 = d1.get("pdpData", {}) if d1 else {} 
    dd2 = d2.get("pdpData", {}) if d2 else {} 
    print({**dd1, **dd2}) 

它輸出:

{'a': 1, 'b': 2, 'c': 3} 
{'a': 2, 'b': 3} 

現在,你已經合併了內類型的字典,所有你需要做的就是收拾他們到另一個dict"pdpData"爲重點,和包裝這些類型的字典到列表中。

0
from collections import defaultdict 

d = defaultdict(dict) 
for l in (l1, l2): 
    for elem in l: 
     d[elem['pdpData']['a']].update(elem['pdpData']) 
l3 = d.values() 

print(l3) 

輸出

dict_values([{'a': 1, 'b': 2, 'c': 3}, {'a': 2, 'b': 3}]) 
+0

雖然你失去了訂單。 –

+1

OP想要一個訂購的清單。你使用一個defaultdict,它是無序的。你不能保證'l3'會有正確的順序。此外,您使用值'a'作爲索引,這似乎不是所需的行爲。 –