2015-12-17 25 views
-2

的價值觀,我有兩個字典:合併兩個庫與元素的列表,並堅持先詞典

first = {"phone": { 
      "home": "(234) 442-4424" 
     }, 
    "address":[{"home":""},{"office":""}] 
     } 


second = {"phone": { 
      "home": "(234) 442-4424", 
      "home1": "(234) 442-4424" 
     }, 
    "address":[] 
     } 

我想先合併兩個字典在第二,這意味着第一字典不失去其原來的值和首先只添加缺失的關鍵值。

最終的字典應該是這樣的: -

final = {"phone": { 
      "home": "(234) 442-4424", 
      "home1": "(234) 442-4424" 
     }, 
    "address":[{"home":""},{"office":""}] 
     } 
+1

你已經試過了嗎?你有什麼嘗試,什麼不起作用? – SiHa

+0

plz檢查這個鏈接它工作正常dictioanry http://stackoverflow.com/questions/33912772/merge-two-dictionaries-and-persist-the-values-of-first-dictionaries但不給所需的結果時,字典有項目列表 – user3048148

+0

我給你的最後一個答案遞歸合併** dictionnaries **,合併包含數組的字典,您需要檢查對象類型(字典或數組)並相應地合併遞歸。請展示一些研究並嘗試,這篇文章是一系列其他3篇文章,您甚至可以在沒有嘗試的情況下提問。 – Cyrbil

回答

-1

你可以使用first.extend(秒)。但是,也許你必須迭代第一個字典的子元素並分別擴展每個子元素。

+0

這不是問題的答案,它最多隻是一條評論。 – SiHa

0

我已經用下面的方法解決了這個: 我的實際數據是:

first_json = {"basic_info":[{"indexPos": "0", "isUpper": "1", "placeHolder": "NAME THIS CARD (Required)", "value": "ddd", "keyName": "CardName"},{"indexPos": "0", "isUpper": "1", "placeHolder": "NAME THIS CARD (Required)sddd", "value": "", "keyName": "CardName11"}]} 

second_json = {"basic_info": [{"indexPos": "0", "isUpper": "1", "placeHolder": "NAME THIS CARD (Required)sddd", "value": "wwwwwwwwww", "keyName": "CardName"},{"indexPos": "0", "isUpper": "1", "placeHolder": "NAME THIS CARD (Required)sddd", "value": "dsfsdfd", "keyName": "CardName11"}]} 

third_json = second_json.copy() 

self.mergeDict(third_json, first_json) 
print third_json 

我們mergeDict功能:

 def mergeDict(self,s, f): 
     for k, v in f.iteritems(): 
     if isinstance(v, collections.Mapping): 
      r = self.mergeDict(s.get(k, {}), v) 
      s[k] = r 
     elif isinstance(v, list): 
      result = [] 
      """ TODO : optimization """ 

      if k == 'basic_info': 
       for valf in v: 
        if 'keyName' in valf: 
         for vals in s.get(k, {}): 
           if valf['keyName'] in vals.values() and vals['value'] !="" and valf['value'] == "": 
            valf['value'] = vals['value'] 
         result.append(valf) 
       """ Reverse loop is for check extra data in second business card """   
       for vals1 in s.get(k, {}): 
         if 'keyName' in vals1: 
          check = 0 
          for valf1 in v: 
           if vals1['keyName'] in valf1.values(): 
           check = 1 
          if not check: 
           result.append(vals1)        
      else: 
       v.extend(s.get(k, {})) 
       for myDict in v: 
        if myDict not in result: 
         result.append(myDict) 

      s[k] = result  
     else: 
      #------------- If the key is blank in first business card then second business card value assign to it -----# 
      if not v and s.get(k, {}): 
       #f[k] = s.get(k, {}) 
       pass 
      else:  
       s[k] = f[k] 
    return s 

此合併功能爲我們提供了所需的知識。請建議我是否可以進一步優化。