Merge dictionaries for two dictionary lists with common key id
I would like to find the expected value instead of processing the key that does not exist on one side.
a=[{'id':1,'add':'add'}, {'id':3,'add':'add'}]
b = [{'id':1,'name':'aaa'}, {'id':2,'name':'bb'}, {'id':3,'name':'cc'}]
Expected Value
c=[{'id':1,'name':'aaa','add':'add'},{'id':2,'name':'bb'},{'id':3,'name':'cc','add':'add'}]
The following is how to use setdefault()
.
d={}
for item in (a+b):
d.setdefault(item['id'], {}).update(item)
c=list(d.values())
print(c)
=>
[{'id':1,'add':'add','name':'aa'},
{'id':2,'name':'bb'},
{'id':3,'add':'add','name':'cc'}]
Use python groupby and dictionary update.
from ittertools import groupby
a = [{'id':1,'add':'add'}, {'id':3,'add':'add'}]
b = [{'id':1,'name':'aaa'}, {'id':2,'name':'bb'}, {'id':3,'name':'cc'}]
ab = a + b
ab.sort (key=lambdax:x ['id'])
c=[ ]
fork,gin groupby(ab,key=lambdax:x['id']):
d=dict()
Forging:
d. update(i)
c.append(d)
Run Results
[{'id':1,'add':'add','name':'aaa'},{'id':2,'name':'bb'},{'id':3,'add':'add','name':'cc'}]
I think there's a cleaner way to do it, but I can do this as a sample:
import copy
a = [{'id':1,'add':'add'}, {'id':3,'add':'add'}]
b = [{'id':1,'name':'aaa'}, {'id':2,'name':'bb'}, {'id':3,'name':'cc'}]
# Convert to dict for simple id keys
a_dict={d['id']:d for d in a}
b_dict={d['id']:d for d in b}
c=copy.copy(a_dict)
all_keys = set(c.keys()) .union(set(b_dict.keys()))
for entry_id in all_keys:
if entry_id inc:
c[entry_id].update(b_dict[entry_id])
else:
c[entry_id] = b_dict[entry_id]
Output:
{1:{'id':1,'add':'add','name':'aaa'},
3:{'id':3,'add':'add','name':'cc'},
2:{'id':2,'name':'bbb'}}
If you want it to be a list,
c=list(c.values())
Output:
[{'id':1,'add':'add','name':'aaa'},
{'id':3,'add':'add','name':'cc'},
{'id':2,'name':'bbb'}]
© 2024 OneMinuteCode. All rights reserved.