从字典中减去元素

2 投票
2 回答
1617 浏览
提问于 2025-04-18 09:46

我有两个字典,假设是这样的:

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 个回答

3

你可以试试用一种叫做 字典推导式 的方法:

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

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

在这里,我们使用 dict#get(key, default) 来避免出现 KeyError 的错误(也就是当你查找的键不在字典里时)。

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的值”,而且它是直接在原来的数据上进行操作的。

有一点挺酷的是,我只需要把操作左边的那个字典转换成 Counter,右边的那个就不用了。

撰写回答