【问题标题】:Combine or merge dictionaries based on more than one key or multi keys基于多个键或多个键组合或合并字典
【发布时间】:2018-04-26 21:11:04
【问题描述】:

我整个上午都在搜索,但大多数合并示例仅基于一个键,我在多个键上找不到任何内容。

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

【问题讨论】:

  • dict.update() 或 ChainMap 怎么样?
  • @What dict.update 肯定会有所帮助,但解决方案并不是那么简单
  • 阅读this question 及其答案是否能解决您的问题?
  • 这也可以通过将您的字典对象转换为完整的类对象来解决,这似乎是您正在模仿的。
  • @AlexHall,谢谢。非常类似于我的问题。我看到了一个问题并在那里发布了我的问题,希望有人可以回答。

标签: python python-3.x dictionary


【解决方案1】:

这是重新键入一个元组:

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

【讨论】:

    【解决方案2】:

    这是使用第 3 方库 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}]
    

    【讨论】:

      猜你喜欢
      • 2021-01-27
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      相关资源
      最近更新 更多