Python: слияние двух списков словарей

Учитывая два списка словарей:

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

Любой способ реализовать merge_lists_of_dicts что объединяет два списка словаря на основе ключей словаря?

Ответ 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'}]

Обратите внимание, что это будет поддерживать как {'id': 2, 'x': 'three'}, так и {'id': 2, 'x': 'two'}, поскольку вы не определили, что должно произойти в этом случае.

Также обратите внимание, что казалось бы эквивалентный и более привлекательный

set(lst1 + lst2)

НЕ работает, так как dict не хешируется.

Ответ 2

Возможно, самый простой вариант

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

Это сохраняет только уникальный ids в списке, но не сохраняет порядок.

Если списки действительно большие, более реалистичным решением будет сортировка их по id и слияние итеративно.

Ответ 3

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

Вы можете сделать это с помощью методов словаря copy и update:

lst3 = lst1.copy()
lst3.update(lst2)

# or even, with the addition:
lst3 = dict(lst1.items() + lst2.items())

Если в ваших словарях дублируются слова, будут использоваться значения второго.

Взгляните на Как объединить два словаря Python в одном выражении?