Ответ 1
Я думаю, что очень Pythonic способ использовал бы понимание dict:
d3 = {key: d1[key] - d2.get(key, 0) for key in d1.keys()}
Обратите внимание, что это работает только в Python 2.7+ или 3.
У меня есть два словаря на 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()):
Я думаю, что очень Pythonic способ использовал бы понимание dict:
d3 = {key: d1[key] - d2.get(key, 0) for key in d1.keys()}
Обратите внимание, что это работает только в Python 2.7+ или 3.
Используйте 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})
Просто обновление для ответа Хайдро.
Рекомендуется использовать метод вычитания вместо "-".
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
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}