@kaxa3201

Как объединить два словаря по id?

list1 = [{
	'processed': 966,
	'violation': 0,
	'no_violation': 966,
	'user_id': UUID('801ef4ee-bc36-3d6e-bdf6-8247ccd3281b')
}]
 list2 = [{
	'assigned': 37,
	'issue': 37,
	'user_id': UUID('63106487-78af-3487-91da-92f380e56e96'),
	'period': '2021-01'
},
{
	'assigned': 1009,
	'issue': 40,
	'user_id': UUID('801ef4ee-bc36-3d6e-bdf6-8247ccd3281b')
}]

Как я могу только те списки у которых user_id одинаковые, а не одинаковые оставить такими же?

желаемый результат
result = [{
	'assigned': 37,
	'issue': 37,
	'user_id': UUID('63106487-78af-3487-91da-92f380e56e96'),
	'period': '2021-01'
},
{
	'no_violation': 966,
	'violation': 0,
	'processed': 966,
	'assigned': 1009,
	'issue': 40,
	'user_id': UUID('801ef4ee-bc36-3d6e-bdf6-8247ccd3281b')
}]
  • Вопрос задан
  • 160 просмотров
Решения вопроса 1
aRegius
@aRegius
Python Enthusiast
from collections import defaultdict
from itertools import chain

data = defaultdict(dict)

for item in chain(list1, list2):
    data[item['user_id']].update(item)

result = list(data.values())
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Ну сначала следует один из списков превратить в словарь с ключом по идентификатору:

d1 = {item['user_id']:item for item in list1}
Потом превращаете в такой же словарь второй список, но по пути можно заодно и данные проапдейтить:
d2 = {
    item['user_id']:{
        **item, 
        **d1.get(item['user_id'], {})
    } 
    for item in list2
}

Теперь, если вам нужен-таки список обратно, то делаете из словаря список его значений:
list(d2.values())

Во втором питоне нужно будет по-другому делать, это для третьего вариант.
Ответ написан
Комментировать
adugin
@adugin Куратор тега Python
from collections import ChainMap
from itertools import groupby
from operator import itemgetter

ig = itemgetter('user_id')

[{**ChainMap(*dicts)} for _, dicts in groupby(sorted(list1 + list2, key=ig), key=ig)]
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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