【问题标题】:Merging multiple lists of dicts with same value in common key在公共键中合并具有相同值的多个字典列表
【发布时间】:2020-03-12 11:54:06
【问题描述】:

我有 2 个字典列表

l1 = [{'company': 'XYZ', 'url': '/xyz', 'industry': 'Utilities', 'sector': 'Conventional electricity'}, {...}]
l2 = [{'url': '/xyz', 'industry': ['Electric utility'],  'website': ['xyz.com']}, {...}]

每个字典都有一个公共键“url”。

我的要求是所有列表中的 dict 中具有相同值的 'url' 键应合并,如果合并时 dicts 中不存在特定键,则为这些键分配 None/null。

期望的输出应该是:

[
{'company': 'XYZ', 'url': '/xyz', 'industry': ['Electric utility', 'Utilities'], 'sector': 'Conventional electricity',  'website': ['xyz.com']},
{...}
]

到目前为止我尝试过的是:

from itertools import groupby
from collections import ChainMap
from operator import itemgetter
from pprint import pprint


def merge_lists_of_dicts(list1, list2, by_key):
    dict_list = list1 + list2
    by_key = itemgetter(by_key)
    res = map(lambda dict_tuple: dict(ChainMap(*dict_tuple[1])),
              groupby(sorted(dict_list, key=by_key), key=by_key))

    return list(res)

pprint(merge_lists_of_dicts(l1, l2, "url"))

我得到的输出是:

 [{'company': 'XYZ',
  'industry': 'Utilities',
  'sector': 'Internet',
  'url': '/xyz',
  'website': ['xyz.com']}, {...}]

感谢任何帮助。最好的pythonic方式会很棒。 提前致谢

【问题讨论】:

    标签: python


    【解决方案1】:

    您可以使用itertools.groupby,然后应用自定义合并功能:

    from itertools import groupby as gb
    l1 = [{'company': 'XYZ', 'url': '/xyz', 'industry': 'Utilities', 'sector': 'Conventional electricity'}]
    l2 = [{'url': '/xyz', 'industry': ['Electric utility'],  'website': ['xyz.com']}]
    def merge(d, url):
       keys = [i for b in d for i in b]
       new_d = {i:(lambda x:None if not x else x)([b[i] for b in d if i in b]) for i in keys}
       _d = {a:b if b is None else b[0] if len(b) == 1 else [j for k in b for j in ([k] if not isinstance(k, list) else k)] for a, b in new_d.items()}
       return {**_d, 'url':url}
    
    newl = [merge(list(b), a) for a, b in gb(sorted(l1+l2, key=lambda x:x['url']), key=lambda x:x['url'])]
    

    输出:

    [{'company': 'XYZ', 'url': '/xyz', 'industry': ['Utilities', 'Electric utility'], 'sector': 'Conventional electricity', 'website': ['xyz.com']}]
    

    【讨论】:

      猜你喜欢
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      • 2017-04-20
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多