如何从字典中减去值

时间:2013-07-16 08:43:42

标签: python dictionary

我在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()):

4 个答案:

答案 0 :(得分:21)

我认为非常Pythonic方式将使用dict comprehension

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

请注意,这仅适用于Python 2.7+或3。

答案 1 :(得分:18)

使用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})

答案 2 :(得分:9)

只是对海德罗回答的更新。

建议使用减法方法而不是“ - ”。

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对象中获取Dictionary

答案 3 :(得分: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}