Объединение двух словарей python в одно, когда чистые значения не являются положительными

У меня есть два словаря python, которые я пытаюсь суммировать вместе. Ответ в: Есть ли какой-нибудь питонический способ объединить два dicts (добавление значений для ключей, которые появляются в обоих)? получает от меня большую часть пути. Однако у меня есть случаи, когда сетевые значения могут быть нулевыми или отрицательными, но мне все же нужны значения в конечном словаре. Несмотря на то, что счетчики будут принимать отрицательные значения, он выдает только значение, если оно больше нуля.

Пример

from collections import Counter   
A = Counter({'a': 1, 'b': 2, 'c': -3, 'e': 5, 'f': 5})
B = Counter({'b': 3, 'c': 4, 'd': 5, 'e': -5, 'f': -6})
C = A + B
print(C.items())

Выход: [('a', 1), ('c', 1), ('b', 5), ('d', 5)]

c = -3 + 4 = 1 является правильным, поэтому отрицательный ввод не является проблемой, но e: 0 и f: -1 отсутствуют на выходе

Как я могу выполнить суммирование и получить все значения?

Ответ 1

Как насчет чего-то типа:

dict((x, a.get(x, 0) + b.get(x, 0)) for x in set(a)|set(b))

Пример:

>>> a = {'a':1, 'b':2, 'c':-3, 'e':5, 'f': 5}
>>> b = {'b':3, 'c':4, 'd':5, 'e':-5, 'f': -6}
>>>
>>> dict((x, a.get(x, 0) + b.get(x, 0)) for x in set(a)|set(b))
{'e': 0, 'a': 1, 'f': -1, 'd': 5, 'c': 1, 'b': 5}

Ответ 2

Суммируя значения капель на 0 и ниже, да, как описано:

Предусмотрено несколько математических операций для объединения объектов Counter для создания мультимножеств (счетчики с числом больше нуля). Сложение и вычитание объединяют счетчики путем добавления или вычитания счетчиков соответствующих элементов. Пересечение и объединение возвращают минимум и максимум соответствующих отсчетов. Каждая операция может принимать входы с подписанными значениями, , но выход будет исключать результаты с нулями или меньше.

[...]

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

Вам нужно будет использовать Counter.update(), если вы хотите сохранить значения в 0 или ниже. Поскольку это операция на месте, вам нужно создать копию здесь:

>>> from collections import Counter   
>>> A = Counter({'a': 1, 'b': 2, 'c': -3, 'e': 5, 'f': 5})
>>> B = Counter({'b': 3, 'c': 4, 'd': 5, 'e': -5, 'f': -6})
>>> C = A.copy()
>>> C.update(B)
>>> C
Counter({'b': 5, 'd': 5, 'a': 1, 'c': 1, 'e': 0, 'f': -1})

Если сохранение A не было целью, вы можете просто обновить его напрямую.