2013-10-24 5 views
10

Предоставлено два списка словарей: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 то, что объединяет два списка словаря на основе ключей Словаре элементы?

+3

Что делать, если lst2 [0] = {id: 2, x: "five"} или если lst2 [0] = {id: 2, y: "y"} – alko

+1

Что делать, если "id" но значение не ?, Почему бы не использовать кортежи, если ваши словари - всего лишь 1 элемент? Я думаю, вы неправильно используете словари? –

+0

Вы используете python 3? – LostAvatar

ответ

5

Один из возможных способов, чтобы определить его:

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 s не hashable.

4
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}] 
0

Вы можете сделать это с copy и update словарных методов:

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

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

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

Посмотрите на How to merge two Python dictionaries in a single expression?

+0

Почему вы вызываете метод копирования для списка? Вопрос заключался не в слиянии dicts, а в списке dicts. – apopovych

5

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

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

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

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

Смежные вопросы