web-dev-qa-db-ja.com

Python:辞書の2つのリストをマージする

辞書の2つのリストがあるとします。

>>> lst1 = [{id: 1, x: "one"},{id: 2, x: "two"}]
>>> lst2 = [{id: 2, x: "two"}, {id: 3, x: "three"}]
>>> merge_lists_of_dicts(lst1, lst2) #merge two lists of dictionary items by the "id" key
[{id: 1, x: "one"}, {id: 2, x: "two"}, {id: 3, x: "three"}]

辞書アイテムのキーに基づいて辞書の2つのリストをマージするmerge_lists_of_dictsを実装する方法はありますか?

18
xiaohan2012

おそらく最も簡単なオプション

result = {x['id']:x for x in lst1 + lst2}.values()

これにより、リスト内で一意のidsのみが保持され、順序は保持されません。

リストが本当に大きい場合、より現実的な解決策は、idで並べ替えて、繰り返しマージすることです。

10
georg

それを定義する1つの可能な方法:

lst1 + [x for x in lst2 if x not in lst1]
Out[24]: [{'id': 1, 'x': 'one'}, {'id': 2, 'x': 'two'}, {'id': 3, 'x': 'three'}]

これはboth{'id': 2, 'x': 'three'}および{'id': 2, 'x': 'two'}その場合にどうなるかを定義しなかったため。

一見同等でより魅力的なことに注意してください

set(lst1 + lst2)

dictsはハッシュ可能ではないため、機能しません。

6
roippi
lst1 = [{"id": 1, "x": "one"}, {"id": 2, "x": "two"}]
lst2 = [{"id": 2, "x": "two"}, {"id": 3, "x": "three"}]

result = []
lst1.extend(lst2)
for myDict in lst1:
    if myDict not in result:
        result.append(myDict)
print result

出力

[{'x': 'one', 'id': 1}, {'x': 'two', 'id': 2}, {'x': 'three', 'id': 3}]
4
thefourtheye