[英]Python merge nested list of dictionary to single list of dictionary
我想將字典的嵌套列表合並到python 2.6中的字典的單個列表中,示例數據-這里僅給出兩次重復的數千次迭代。
INPUTJSON=[
{'EXCEPTIONS':
[
{'LASTOCCURED': '2018-03-12 12:11:23', 'COUNT': 25, 'NAME': 'CLFRW0134W'},
{'LASTOCCURED': '2018-03-12 12:11:42', 'COUNT': 10, 'NAME': 'SRV0145GH'}
],
'JVM_NAME': 'TestiingAWS01', 'GCCOUNT': 10},
{'EXCEPTIONS':
[
{'LASTOCCURED': '2018-03-13 12:14:23', 'COUNT': 25, 'NAME': 'CLFRW0134W'},
{'LASTOCCURED': '2018-03-18 12:55:23', 'COUNT': 10, 'NAME': 'SRV0145GH'}
],
'JVM_NAME': 'QAAWS02', 'GCCOUNT': 10}
]
預期結果:
[
{'JVM_NAME':'TestiingAWS01','GCCOUNT':10, 'LASTOCCURED': '2018-03-12 12:11:23', 'COUNT': 25, 'NAME': 'CLFRW0134W'}, {'LASTOCCURED': '2018-03-12 12:11:42', 'COUNT': 10, 'NAME': 'SRV0145GH', 'JVM_NAME':'TestiingAWS01','GCCOUNT':10},
{'JVM_NAME': 'QAAWS02', 'GCCOUNT': 10, 'LASTOCCURED': '2018-03-13 12:14:23', 'COUNT': 25, 'NAME': 'CLFRW0134W'}, {'LASTOCCURED': '2018-03-18 12:55:23', 'COUNT': 10, 'NAME': 'SRV0145GH', 'JVM_NAME': 'QAAWS02', 'GCCOUNT': 10}
]
請專家幫助我實現這一目標,以便我可以輕松地將最終數據處理到sqlite。
更新:謝謝所有專家為您提供快速解決方案,在這里將所有答案合並在一起,通過避免使用python 2.6上的硬鍵“鍵”(每次迭代中將有40個鍵),我為我的數據提供了有效的代碼。
def merge_two_dicts(x, y):
"""Given two dicts, merge them into a new dict as a shallow copy."""
z = x.copy()
z.update(y)
return z
resultlist =[]
for i,v in enumerate(INPUTJSON):
EXCEPTIONS = v["EXCEPTIONS"]
del v["EXCEPTIONS"]
for j,val in enumerate(EXCEPTIONS):
resultlist.append(merge_two_dicts(EXCEPTIONS[j],INPUTJSON[i]))
print resultlist
可以使用lambda將其編譯到理解列表中嗎?
這是一種方法。
lst = [{**{'JVM_NAME': i['JVM_NAME'], 'GCCOUNT': i['GCCOUNT'], **w}} \
for i in INPUTJSON for w in i['EXCEPTIONS']]
有關**
語法,請參見如何在一個表達式中合並兩個字典?
結果
[{'COUNT': 25,
'GCCOUNT': 10,
'JVM_NAME': 'TestiingAWS01',
'LASTOCCURED': '2018-03-12 12:11:23',
'NAME': 'CLFRW0134W'},
{'COUNT': 10,
'GCCOUNT': 10,
'JVM_NAME': 'TestiingAWS01',
'LASTOCCURED': '2018-03-12 12:11:42',
'NAME': 'SRV0145GH'},
{'COUNT': 25,
'GCCOUNT': 10,
'JVM_NAME': 'QAAWS02',
'LASTOCCURED': '2018-03-13 12:14:23',
'NAME': 'CLFRW0134W'},
{'COUNT': 10,
'GCCOUNT': 10,
'JVM_NAME': 'QAAWS02',
'LASTOCCURED': '2018-03-18 12:55:23',
'NAME': 'SRV0145GH'}]
您可以嘗試以下方法:
INPUTJSON=[
{'EXCEPTIONS':
[
{'LASTOCCURED': '2018-03-12 12:11:23', 'COUNT': 25, 'NAME':
'CLFRW0134W'},
{'LASTOCCURED': '2018-03-12 12:11:42', 'COUNT': 10, 'NAME':
'SRV0145GH'}
],
'JVM_NAME': 'TestiingAWS01', 'GCCOUNT': 10},
{'EXCEPTIONS':
[
{'LASTOCCURED': '2018-03-13 12:14:23', 'COUNT': 25, 'NAME': 'CLFRW0134W'},
{'LASTOCCURED': '2018-03-18 12:55:23', 'COUNT': 10, 'NAME': 'SRV0145GH'}
],
'JVM_NAME': 'QAAWS02', 'GCCOUNT': 10}
]
new_result = [i for b in [[dict([('JVM_NAME', i['JVM_NAME']), ('GCCOUNT', i['GCCOUNT'])]+b.items()) for b in i['EXCEPTIONS']] for i in INPUTJSON] for i in b]
輸出:
[{'LASTOCCURED': '2018-03-12 12:11:23', 'JVM_NAME': 'TestiingAWS01', 'GCCOUNT': 10, 'COUNT': 25, 'NAME': 'CLFRW0134W'}, {'LASTOCCURED': '2018-03-12 12:11:42', 'JVM_NAME': 'TestiingAWS01', 'GCCOUNT': 10, 'COUNT': 10, 'NAME': 'SRV0145GH'}, {'LASTOCCURED': '2018-03-13 12:14:23', 'JVM_NAME': 'QAAWS02', 'GCCOUNT': 10, 'COUNT': 25, 'NAME': 'CLFRW0134W'}, {'LASTOCCURED': '2018-03-18 12:55:23', 'JVM_NAME': 'QAAWS02', 'GCCOUNT': 10, 'COUNT': 10, 'NAME': 'SRV0145GH'}]
但是請注意,在使用拆包時,此問題在Python3中更簡單:
final_result = [i for b in [[{**{a:b for a, b in i.items() if a != 'EXCEPTIONS'}, **c} for c in i['EXCEPTIONS']] for i in INPUTJSON] for i in b]
輸出:
[{'LASTOCCURED': '2018-03-12 12:11:23', 'JVM_NAME': 'TestiingAWS01', 'GCCOUNT': 10, 'COUNT': 25, 'NAME': 'CLFRW0134W'}, {'LASTOCCURED': '2018-03-12 12:11:42', 'JVM_NAME': 'TestiingAWS01', 'GCCOUNT': 10, 'COUNT': 10, 'NAME': 'SRV0145GH'}, {'LASTOCCURED': '2018-03-13 12:14:23', 'JVM_NAME': 'QAAWS02', 'GCCOUNT': 10, 'COUNT': 25, 'NAME': 'CLFRW0134W'}, {'LASTOCCURED': '2018-03-18 12:55:23', 'JVM_NAME': 'QAAWS02', 'GCCOUNT': 10, 'COUNT': 10, 'NAME': 'SRV0145GH'}]
data = list()
for item in INPUTJSON:
EXCEPTIONS = item["EXCEPTIONS"]
del item["EXCEPTIONS"]
for ex in EXCEPTIONS:
tmp = dict()
tmp.update(ex)
tmp.update(item)
data.append(tmp)
print data
你可以試試:
final_one=[]
for i in data:
final=[]
temp={}
for m,n in i.items():
if not isinstance(n,list):
temp[m]=n
else:
final+=n
for h in final:
h.update(temp)
final_one+=final
print(final_one)
輸出:
[{'COUNT': 25, 'NAME': 'CLFRW0134W', 'LASTOCCURED': '2018-03-12 12:11:23', 'JVM_NAME': 'TestiingAWS01', 'GCCOUNT': 10}, {'COUNT': 10, 'NAME': 'SRV0145GH', 'LASTOCCURED': '2018-03-12 12:11:42', 'JVM_NAME': 'TestiingAWS01', 'GCCOUNT': 10}, {'COUNT': 25, 'NAME': 'CLFRW0134W', 'LASTOCCURED': '2018-03-13 12:14:23', 'JVM_NAME': 'QAAWS02', 'GCCOUNT': 10}, {'COUNT': 10, 'NAME': 'SRV0145GH', 'LASTOCCURED': '2018-03-18 12:55:23', 'JVM_NAME': 'QAAWS02', 'GCCOUNT': 10}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.