从字典中减去元素
我有两个字典,假设是这样的:
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,右边的那个就不用了。