我已經用下面的方法解決了這個: 我的實際數據是:
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
此合併功能爲我們提供了所需的知識。請建議我是否可以進一步優化。
你已經試過了嗎?你有什麼嘗試,什麼不起作用? – SiHa
plz檢查這個鏈接它工作正常dictioanry http://stackoverflow.com/questions/33912772/merge-two-dictionaries-and-persist-the-values-of-first-dictionaries但不給所需的結果時,字典有項目列表 – user3048148
我給你的最後一個答案遞歸合併** dictionnaries **,合併包含數組的字典,您需要檢查對象類型(字典或數組)並相應地合併遞歸。請展示一些研究並嘗試,這篇文章是一系列其他3篇文章,您甚至可以在沒有嘗試的情況下提問。 – Cyrbil