

共通のキーidがある２つの辞書型リストで、辞書内のidが共通のものは辞書をマージ  
片方にキーが存在しないものは処理をせず、期待する値を求めたいです。

[code]

    a = [{'id': 1, 'add': 'add'}, {'id': 3, 'add': 'add'}]
    b = [{'id': 1, 'name':'aaa'}, {'id': 2, 'name': 'bbb'}, {'id': 3, 'name': 'ccc'}]
    
[/code]

期待する値

[code]

    c = [{'id': 1, 'name':'aaa', 'add': 'addd'}, {'id': 2, 'name': 'bbb'}, {'id': 3, 'name': 'ccc', 'add': 'add'}]
    
[/code]


CC BY-SA 4.0
2020-07-14T01:58:06.283
68567
2020-07-14T11:53:41.403
2020-07-14T11:53:41.403
3060
29779
question
python
Python で複数の辞書型リストを一つに結合したい


もっとキレイなやり方があるような気がしますが、サンプルとしてこのようにできます：

[code]

    import copy
    
    a = [{'id': 1, 'add': 'add'}, {'id': 3, 'add': 'add'}]
    b = [{'id': 1, 'name':'aaa'}, {'id': 2, 'name': 'bbb'}, {'id': 3, 'name': 'ccc'}]
    
    
    # 簡易idでキーできるようにdictへ変換
    a_dict = {d['id']: d for d in a}
    b_dict  = {d['id']: d for d in b}
    
    c = copy.copy(a_dict)
    
    all_keys  = set(c.keys()).union(set(b_dict.keys()))
    for entry_id in all_keys:
        if entry_id in c:
            c[entry_id].update(b_dict[entry_id])
        else:
            c[entry_id] = b_dict[entry_id]
    
    
    
[/code]

出力：

> {1: {'id': 1, 'add': 'add', 'name': 'aaa'},  
>  3: {'id': 3, 'add': 'add', 'name': 'ccc'},  
>  2: {'id': 2, 'name': 'bbb'}}

それがリストにしたいなら

[code]

    c = list(c.values())
    
[/code]

出力：

> [{'id': 1, 'add': 'add', 'name': 'aaa'},  
>  {'id': 3, 'add': 'add', 'name': 'ccc'},  
>  {'id': 2, 'name': 'bbb'}]


CC BY-SA 4.0
2020-07-14T02:32:00.897
68570
2020-07-14T04:29:51.267
2020-07-14T04:29:51.267
2314
2314
68567
answer


pythonのgroupbyと辞書のupdateを使う方法です。

[code]

    from itertools import groupby
    a = [{'id': 1, 'add': 'add'}, {'id': 3, 'add': 'add'}]
    b = [{'id': 1, 'name':'aaa'}, {'id': 2, 'name': 'bbb'}, {'id': 3, 'name': 'ccc'}]
    
    ab = a+b
    ab.sort(key=lambda x: x['id'])
    c = []
    for k, g in groupby(ab, key=lambda x: x['id']):
        d = dict()
        for i in g:
            d.update(i) 
        c.append(d)
    
[/code]

実行結果

[code]

    [{'id': 1, 'add': 'add', 'name': 'aaa'}, {'id': 2, 'name': 'bbb'}, {'id': 3, 'add': 'add', 'name': 'ccc'}]
    
[/code]


CC BY-SA 4.0
2020-07-14T05:57:11.670
68575
2020-07-14T05:57:11.670
35558
68567
answer


以下は `setdefault()` を使う方法です。

[code]

    d = {}
    for item in (a + b):
      d.setdefault(item['id'], {}).update(item)
    c = list(d.values())
    
    print(c)
    =>
    [{'id': 1, 'add': 'add', 'name': 'aaa'},
     {'id': 2, 'name': 'bbb'},
     {'id': 3, 'add': 'add', 'name': 'ccc'}]
    
[/code]


CC BY-SA 4.0
2020-07-14T09:19:58.010
68584
2020-07-14T09:19:58.010
68567
answer