Функция которая принимает неограниченное количество словарей и возвращает объединяющий их словарь Python
Как написать функцию, которая принимает неограниченное количество словарей и возвращает объединяющий их словарь?
При этом все значения в словаре имеют числовое значение, если ключи совпадают то их значения суммируются, числа в значениях могут быть как положительными так и отрицательными.
Пример словарей:
first = {"a": 2, "b": 4};
second = {"a": 2, "b": 10};
third = {"d": -5};
Вывод:
{'a': 4, 'b': 14, 'd': -5}
Пробовал так, но это не подходит:
def sum_dicts(dict1, dict2) -> dict:
dict3 = Counter(dict1) + Counter(dict2)
return dict3
Также пробовал объединять через {**dict1, **dict2}, тоже не подходит.
Ответы (2 шт):
def merge_dicts(*dicts):
result = {}
for dictionary in dicts:
for key, value in dictionary.items():
if key in result:
result[key] += value
else:
result[key] = value
return result
first = {"a": 2, "b": 4}
second = {"a": 2, "b": 10}
third = {"d": -5}
merged_dict = merge_dicts(first, second, third)
print(merged_dict)
На выходе получается:
{'a': 4, 'b': 14, 'd': -5}
Отмечу, что эта функция использует оператор * для передачи неограниченного количества аргументов в функцию как кортеж. И использует цикл for для обхода каждого словаря и внутри цикла другой цикл for для прохода по ключам и значениям каждого словаря. Если ключ уже есть в результирующем словаре, то значение ключа увеличивается, если это не так, то создается новый ключ с данным значением.
Самый элегантный и простой способ - использовать Counter:
from collections import Counter
first = {"a": 2, "b": 4};
second = {"a": 2, "b": 10};
third = {"d": -5};
def get_sum_dict(*dicts):
result = Counter()
for d in dicts:
result.update(d)
return dict(result)
print(get_sum_dict(first, second, third))
Вывод:
{'a': 4, 'b': 14, 'd': -5}
В вашей попытке оператор + для объектов типа Counter не сработал так, как вы хотели, потому что Counter реализован таким образом, что ключи с отрицательными значениями не учитываются в результате, поэтому во избежание такого поведения следует использовать метод update().