@Ivan_R2

Как объединить два списка словарей без потери словаря с несовпадающим ключем на Python 3?

Здравствуйте!
Есть два списка словарей:
a = [{'code': 'a1', 'total1': 7}, {'code': 'a2', 'total1': 17}]
b = [{'code': 'a1', 'total2': 55}, {'code': 'a3', 'total2': 22}]

Как на выходе получить:
1)
l = [{'code': 'a1', 'total1': 7, 'total2': 55}, 
      {'code': 'a2', 'total1': 17}, 
      {'code': 'a3', 'total2': 22}]

2)
l = [{'code': 'a1', 'total1': 7, 'total2': 55}, 
      {'code': 'a2', 'total1': 17, 'total2': 0}, 
      {'code': 'a3', 'total2': 22, 'total1':0}]

Пробовал такие варианты:
l = list()
for i, j in zip(a, b):  # Проходим по элементам списков
    i.update(j)  # Записываем всё в один словарь
    l.append(i)

и l = [dict(i, **j) for i, j in zip(a, b)]
Но результатом был список
[{'code': 'a1', 'total1': 7, 'total2': 55}, {'code': 'a3', 'total1': 17, 'total2': 22}]

Желательно, сделать так, чтобы функция не была слишком медлительной.
Спасибо
  • Вопрос задан
  • 654 просмотра
Решения вопроса 2
@deliro
from itertools import chain

a = [{'code': 'a1', 'total1': 7}, {'code': 'a2', 'total1': 17}]
b = [{'code': 'a1', 'total2': 55}, {'code': 'a3', 'total2': 22}]

def f(a, b):
    cache = {}
    for dct in chain(a, b):
        code = dct["code"]
        cache.setdefault(code, dct).update(dct)

    return list(cache.values())

f(a, b)


Нули расставить по вкусу. Алгоритм ест дополнительную память, но по скорости вряд ли можно что-то быстрей.
Ответ написан
aRegius
@aRegius
Python Enthusiast
import itertools
from collections import defaultdict

temp_data = defaultdict(dict)

for item in itertools.chain(a, b):
      temp_data[item['code']].update(item)

data = list(temp_data.values())
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы