2017-04-18 113 views
0

下面是來自類似輸入的大文件的示例輸入。如何合併兩個詞典與Python中的字典?

{ 
    "V-Su7890": [ 
     [ 
      { 
       "url": "www.talent.com", 
       "tid": "V-Su7890", 
       "id": "58ff787ffbad487b2c", 
       "company_name": "Talent Ltd" 
      } 
     ], 
     [ 
      { 
       "socials": ["facebook", "linkedin", "twitter"], 
       "title": "title of the pag", 
       "contact": ["+9563802140"], 
       "email": "email_id1" 
      }, 
      { 
       "socials": ["facebook", "twitter", "linkedin"], 
       "title": "next title of the page", 
       "contact": ["+919765983442"], 
       "email": "email_id2" 
      } 
     ] 
    ] 
} 

我不得不當前詞典的第二列表的所有分字典合併成一個字典沒有重複的值,然後存入字典作爲一個值鍵「V-Su7890」。

所需的輸出是:

{ 
    "V-Su7890": [ 
     [ 
      { 
       "url": "www.talent.com", 
       "tid": "V-Su7890", 
       "id": "58ff787ffbad487b2c", 
       "company_name": "Talent Ltd" 
      } 
     ], 
     [ 
      { 
       "socials": ["facebook", "linkedin", "twitter"], 
       "title": ["title of the pag", "next title of the page"], 
       "contact": ["+9563802140", "+919765983442"], 
       "email": ["email_id","email_id2"] 
      } 
     ] 
    ] 
} 

請幫助我瞭解和解決這個問題。

+0

你嘗試過什麼到目前爲止並在運行什麼問題到? – pvg

回答

1

您可以使用setdefault()以默認值插入關鍵(在這裏你可以使用空表),並extend列表,如果新項目不存在。

for k,v in a.items(): 
    tmp={} 
    for i in v[1]: 
     for k1,v2 in i.items(): 
      if isinstance(v2,list): 
       tmp.setdefault(k1,[]).extend(i for i in v2 if i not in tmp[k1]) 
      else: 
       tmp.setdefault(k1,[]).append(v2) 
    a[k]=[v[0],[tmp]] 
print(a) 

結果:

{ 
    'V-Su7890': [ 
    ... 
    [ 
     { 
     'contact': ['+9563802140','+919765983442'], 
     'socials': ['facebook','linkedin','twitter'], 
     'email': ['email_id1','email_id2'], 
     'title': ['title of the pag','next title of the page'] 
     } 
    ] 
    ] 
} 
+0

謝謝,但是,這也將下一個記錄結合到以前的字典中。例如,{「V-Su7890」:[..................],''V-SZ86385ZM':[............ ..]},'email'中的值包含重複項。 – Niveram

+0

@Niveram我編輯我的答案,將'tmp = {}'放在for循環中,並且它不會合並下一條記錄。 – McGrady

+0

很好..謝謝麥格雷迪。 – Niveram

0

假設你存儲完整dict在一個變量V.我們爲socialstitle等存儲在一組值,以避免出現重複的值。稍後,我們會將這些設置轉換爲列表。這裏的解決方案:

V = k["V-Su7890"][1] 
new_dict = {} 

for v in V: 
    for key, value in v.iteritems(): 
     if not new_dict.get(key, None): 
      new_dict[key] = set() 

     if isinstance(value, list): 
      for val in value: 
       new_dict[key].add(val) 
     else: 
      new_dict[key].add(value) 

# Converting the sets to list 
for key, value in new_dict.iteritems(): 
    new_dict[key] = list(value) 

k["V-Su7890"][1] = [new_dict] 
+0

對不起,我有疑問。什麼是V = k [「V-Su7890」] [1]?你提到「存儲完整的字典在一個變量V」,但該文件只包含字典列表,因爲我已經在上面採樣了 – Niveram

+0

你已經把原始的dict列表包含在大括號內,這本身就是一個字典。 {「V-Su7890」:[...] – Charul