Как объединить диктонарные значения с дубликатами
В Django у меня есть два аннотированных результата из двух разных моделей, я объединил их с помощью itertools и получил такие результаты. Первоначально мне успешно удалось получить все дубликаты и добавить их значения с помощью values().annotate(), теперь моя проблема в том, как из этого списка словаря я могу получить результат, указанный ниже. По сути, я просто хочу получить все одинаковые set_type и добавить их значения. Пример: все 'bazel' должны добавить карат, количество и зарплату, кроме ставки, то же самое с 'pave'. Заранее спасибо.
source_dict = [ {'setting_type': 'bazel', 'rate': 45, 'carat': 10.30, 'количество': 10, 'зарплата': 450}, { 'set_type': 'pave', 'rate': 30, 'carat': 10.43, 'количество': 10, 'зарплата': 300}, {'set_type': 'center', 'rate': 10, 'carat': 3.35, 'количество': 45, 'зарплата': 450}, {'set_type': 'pave', 'rate': 30, 'carat': 4.10, 'количество': 23, 'зарплата': 690}, {'set_type': 'bazel', 'rate': 45, 'carat': 31.10, 'количество': 50, 'зарплата': 2250} ]
Результат:
desired_result[ {'setting_type': 'bazel', 'rate': 45, 'carat': 41.40, 'количество': 60, 'зарплата': 2700}, {'set_type': 'pave', 'rate': 30, 'carat': 14.53, 'количество': 33, 'зарплата': 990}, {'set_type': 'center', 'rate': 10, 'carat': 3.35, 'количество': 45, 'зарплата': 450} ]
Вы можете создать dict со значениями из setting_type в качестве ключей, и добавить все результаты, основываясь на том, есть ли они уже в этом dict.
source_dict = [
{'setting_type': 'bazel', 'rate': 45, 'carat': 10.30, 'quantity': 10, 'salary': 450},
{'setting_type': 'pave', 'rate': 30, 'carat': 10.43, 'quantity': 10, 'salary': 300},
{'setting_type': 'center', 'rate': 10, 'carat': 3.35, 'quantity': 45, 'salary': 450},
{'setting_type': 'pave','rate': 30, 'carat': 4.10, 'quantity': 23, 'salary': 690},
{'setting_type': 'bazel', 'rate': 45, 'carat': 31.10, 'quantity': 50, 'salary': 2250}
]
result_dict = {}
for item in source_dict:
st_key = item['setting_type']
# check if 'setting_type' already exists in result_dict:
if st_key not in result_dict:
result_dict[st_key] = {}
# add values
for key, value in item.items():
if key != 'setting_type':
if key not in result_dict[st_key]:
result_dict[st_key][key] = 0
result_dict[st_key][key] += value
# reformat result_dict to list
results = []
for key, value in result_dict.items():
value.update({'setting_type': key})
results.append(value)
print(results)
# [
# {'setting_type': 'bazel', 'rate': 45, 'carat': 41.40, 'quantity': 60, 'salary': 2700},
# {'setting_type': 'pave', 'rate': 30, 'carat': 14.53, 'quantity': 33, 'salary': 990},
# {'setting_type': 'center', 'rate': 10, 'carat': 3.35, 'quantity': 45, 'salary': 450}
# ]