Python 基于多个键或多个键组合或合并词典

Python 基于多个键或多个键组合或合并词典,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我整个上午都在搜索,但是大多数合并的例子都是基于一个键,我在多个键上找不到任何东西 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_

我整个上午都在搜索,但是大多数合并的例子都是基于一个键,我在多个键上找不到任何东西

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}
    ]

这是对元组重新设置关键帧:

>>> 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}]

下面是一个使用第三方库
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}]

那么dict.update()或ChainMap呢?@什么dict.update肯定会有帮助,但解决方法并不是简单易懂,它的答案可以解决你的问题。这也可以通过将字典对象转换为完全成熟的类对象来解决,这似乎是你在模仿的。@AlexHall,谢谢。与我的问题非常相似。我看到一个问题,把我的问题贴在那里,希望有人能回答。