【问题标题】:Merge list of dictionaries where id is duplicate - python3 [duplicate]合并 id 重复的字典列表 - python3 [重复]
【发布时间】:2020-05-29 20:26:30
【问题描述】:

我有一个字典列表:

[{"id":"1", "name":"Alice", "age":"25", "languages":"German"},
 {"id":"1", "name":"Alice", "age":"25", "languages":"French"},
 {"id":"2", "name":"John", "age":"30", "languages":"English"},
 {"id":"2", "name":"John", "age":"30", "languages":"Spanish"}]

我希望最终结果是(我在检查重复项时只考虑 id):

[{"id":"1", "name":"Alice", "age":"25", "languages":"German, French"},
 {"id":"2", "name":"John", "age":"30", "languages":"English, Spanish"}]

看着类似的问题,我认为使用集合可能是答案,但一直无法正确实现。

提前感谢您的回答。

【问题讨论】:

    标签: python list dictionary merge duplicates


    【解决方案1】:

    在这里有点冗长以帮助查看结构。绝对可以做一些很酷的 lambda 东西来解决这个问题,并使列表理解更加“pythonic”。但这里有一个快速的解决方案!

    # Set up initial data
    unmerged = [
        {"id":"1", "name":"Alice", "age":"25", "languages":"German"},
        {"id":"1", "name":"Alice", "age":"25", "languages":"French"},
        {"id":"2", "name":"John", "age":"30", "languages":"English"},
        {"id":"2", "name":"John", "age":"30", "languages":"Spanish"}]
    
    # merge the data by your composite key of id-name-age
    merged = {}
    for entry in unmerged:
        entry_id = entry['id']
        entry_name = entry['name']
        entry_age = entry['age']
        entry_languages = entry['languages']
        composite_key = entry_id + entry_name + entry_age
        if composite_key in merged:
            merged[composite_key]['languages'].append(entry_languages)
        else:
            merged[composite_key] = {
                'id': entry_id,
                'name': entry_name,
                'age': entry_age,
                'languages': [entry_languages]
            }
    
    # reconstruct your list with just your unique entries
    cleaned = []
    for key, value in merged.items():
        print(key, value)
        cleaned.append({
            'id': value['id'],
            'name': value['name'],
            'age': value['age'],
            'languages': ', '.join(value['languages']) # string join langauges by ", "
        })
    
    for clean in cleaned:
        print(clean)
    

    然后给你你的最终输出,其中清理的是你的合并条目列表:

    {'id': '1', 'name': 'Alice', 'age': '25', 'languages': 'German, French'}
    {'id': '2', 'name': 'John', 'age': '30', 'languages': 'English, Spanish'}
    

    谢谢,如果这有帮助,请告诉我!

    【讨论】:

    • 感谢您抽出宝贵的时间,非常感谢 - 它运行良好。
    • 如果您接受此为正确答案,请将其标记为已接受。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-08-14
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    相关资源
    最近更新 更多