我整个上午都在搜索,但大多数合并的例子都只基于一个键,我无法在多个键上找到任何内容。
x = [
{'pid':111, 'sid':6, 'eid':123, 'x_qty':30},
{'pid':222, 'sid':56, 'eid':6212, 'x_qty':2}
]
y = [
{'pid':111, 'sid':6, 'eid':123, 'y_qty':123},
{'pid':333, 'sid':56, 'eid':6212, 'y_qty':112}
]
pid = 111,sid = 6,eid = 123的值在x和y中匹配,然后合并为一条记录。如果他们不匹配,只需按原样结束。
我想要的最终结果:
z = [
{'pid': 111, 'sid': 6, 'eid': 123, 'x_qty': 30, 'y_qty': 123},
{'pid': 222, 'sid': 56, 'eid': 6212, 'x_qty': 2},
{'pid': 333, 'sid': 56, 'eid': 6212, 'y_qty': 112}
]
答案 0 :(得分:4)
这是重新组合元组:
>>> from operator import itemgetter
>>> from collections import defaultdict
>>> data = defaultdict(dict)
>>> f = itemgetter('pid', 'sid', 'eid')
>>> for d in [*x, *y]:
... data[f(d)].update(d)
...
>>> list(data.values())
[{'eid': 123, 'pid': 111, 'sid': 6, 'x_qty': 30, 'y_qty': 123},
{'eid': 6212, 'pid': 222, 'sid': 56, 'x_qty': 2},
{'eid': 6212, 'pid': 333, 'sid': 56, 'y_qty': 112}]
答案 1 :(得分:0)
以下是使用第三方库pandas
的替代方案,它接受字典列表。
import pandas as pd
# merge data
merged = pd.DataFrame(x).merge(pd.DataFrame(y), how='outer')
# iterate, remove nan, convert to int
res = [s.dropna().astype(int).to_dict() for _, s in merged.iterrows()]
[{'eid': 123, 'pid': 111, 'sid': 6, 'x_qty': 30, 'y_qty': 123},
{'eid': 6212, 'pid': 222, 'sid': 56, 'x_qty': 2},
{'eid': 6212, 'pid': 333, 'sid': 56, 'y_qty': 112}]