从字典中减去元素

时间:2014-06-14 08:50:30

标签: python dictionary counter

我有两本词典,让我们说:

dict_a = {"A": 3.0, "C": 4.0, "B": 6.0}
dict_b = {"A": 3.0, "C": 5.0, "D": 1.0}

我想计算一个减法dict_a - dict_b,所以输出给了我:

{"A": 0.0, "B": 6.0, "C": -1.0, "D": -1.0}

谷歌搜索了一段时间我见过人们使用Counter来执行这样的操作,但是做了一些简单的事情,比如

dict(Counter(dict_a) - Counter(dict_b))

只给我

{"A": 0.0, "B": 6.0}

即,如果密钥不在dict_a中,它将不会出现在输出中。

到目前为止,我已经管理了以下解决方案:

dict_b2 = dict_b.copy()
dict_c = {}
for i in dict_a.keys():
   dict_c.update({i: dict_a[i] - dict_b2.pop(i,0.0)})
   # Changes sign to the remaining values from dict_b2
dict_c.update({k: 0.0 - v for k, v in dict_b2.iteritems()})

但我知道必须有一种更加优雅和有效的方式。

有什么想法吗?

2 个答案:

答案 0 :(得分:7)

事实证明,Counter有一个(没有很好记录的)subtract方法:

>>> dict_a = {"A": 3.0, "C": 4.0, "B": 6.0}
>>> dict_b = {"A": 3.0, "C": 5.0, "D": 1.0}
>>> from collections import Counter
>>> a = Counter(dict_a)
>>> a.subtract(dict_b)
>>> a
Counter({'B': 6.0, 'A': 0.0, 'C': -1.0, 'D': -1.0})

请注意,这不会受Counter.__sub__强加的“0以下值”约束,但它确实执行就地操作。

有点酷的是,我没有必要将两个 dicts转换为一个Counter - 只是操作左侧的那个。

答案 1 :(得分:3)

您可以尝试使用字典理解

new_dict = {k:dict_a.get(k, 0) - dict_b.get(k, 0)
            for k in dict_a.keys() + dict_b.keys()}

# {'A': 0.0, 'C': -1.0, 'B': 6.0, 'D': -1.0}

我们使用dict#get(key, default)来避免获取KeyError(当密钥不属于其中一个词典时)。