Функция которая принимает неограниченное количество словарей и возвращает объединяющий их словарь Python

Рейтинг: 1Ответов: 2Опубликовано: 20.01.2023

Как написать функцию, которая принимает неограниченное количество словарей и возвращает объединяющий их словарь?

При этом все значения в словаре имеют числовое значение, если ключи совпадают то их значения суммируются, числа в значениях могут быть как положительными так и отрицательными.

Пример словарей:

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}, тоже не подходит.

Ответы

▲ 0Принят

Самый элегантный и простой способ - использовать 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().

▲ 0
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 для прохода по ключам и значениям каждого словаря. Если ключ уже есть в результирующем словаре, то значение ключа увеличивается, если это не так, то создается новый ключ с данным значением.