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

Как вычесть значения из словарей

У меня есть два словаря на Python:

d1 = {'a': 10, 'b': 9, 'c': 8, 'd': 7}
d2 = {'a': 1, 'b': 2, 'c': 3, 'e': 2}

Я хочу вычитать значения между словарями d1-d2 и получить результат:

d3 = {'a': 9, 'b': 7, 'c': 5, 'd': 7 }

Теперь я использую две петли, но это решение не слишком быстро

for x,i in enumerate(d2.keys()):
        for y,j in enumerate(d1.keys()):
4b9b3361

Ответ 1

Я думаю, что очень Pythonic способ использовал бы понимание dict:

d3 = {key: d1[key] - d2.get(key, 0) for key in d1.keys()}

Обратите внимание, что это работает только в Python 2.7+ или 3.

Ответ 2

Используйте collections.Counter. Синтаксис очень прост:

>>> from collections import Counter
>>> d1 = Counter({'a': 10, 'b': 9, 'c': 8, 'd': 7})
>>> d2 = Counter({'a': 1, 'b': 2, 'c': 3, 'e': 2})
>>> d3 = d1 - d2
>>> print d3
Counter({'a': 9, 'b': 7, 'd': 7, 'c': 5})

Ответ 3

Просто обновление для ответа Хайдро.

Рекомендуется использовать метод вычитания вместо "-".

d1.subtract(d2)

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

c = Counter(a=4, b=2, c=0, d=-2)
d = Counter(a=1, b=2, c=3, d=4)
a = c-d
print(a)        # --> Counter({'a': 3})
c.subtract(d)
print(c)        # --> Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})

Обратите внимание, что словарь обновляется при использовании метода вычитания.

И, наконец, используйте dict (c) для получения словаря из объекта Counter

Ответ 4

Haidro опубликовал простое решение, но даже без collections вам нужен только один цикл:

d1 = {'a': 10, 'b': 9, 'c': 8, 'd': 7}
d2 = {'a': 1, 'b': 2, 'c': 3, 'e': 2}
d3 = {}

for k, v in d1.items():
    d3[k] = v - d2.get(k, 0) # returns value if k exists in d2, otherwise 0

print(d3) # {'c': 5, 'b': 7, 'a': 9, 'd': 7}