Объединение двух словарей 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
не было целью, вы можете просто обновить его напрямую.