Counter对象执行减法运算如何保留结果中的零值和负值
Python Counter 减法保留零值与负值的实现方法
问题原因说明
collections.Counter重载的-运算符默认仅保留计数大于0的键,计数<=0的键会被自动过滤,因此默认减法无法得到负值、零值对应的键。subtract()为Counter的原地修改方法,不会返回新的Counter对象,直接将方法调用结果赋值给变量只会得到None。
实现方案
方案1:使用subtract()方法(推荐)
先复制原Counter对象避免修改原始数据,再调用subtract()执行减法,会自动保留所有正负、零值:
from collections import Counter dic = {'1':6 , '2':4 , '3':2} dic2 = {'1':3 , '2':1 , '3':5} obj1 = Counter(dic) obj2 = Counter(dic2) # 复制原对象,不修改原始obj1 res = obj1.copy() # 执行减法操作,原地修改res res.subtract(obj2) print(res) # 输出:Counter({'1': 3, '2': 3, '3': -3})
方案2:手动遍历键计算差值
取两个Counter的所有键的并集,逐个计算差值生成新的Counter,同样可以保留所有值:
from collections import Counter dic = {'1':6 , '2':4 , '3':2} dic2 = {'1':3 , '2':1 , '3':5} obj1 = Counter(dic) obj2 = Counter(dic2) res = Counter({k: obj1.get(k, 0) - obj2.get(k, 0) for k in obj1.keys() | obj2.keys()}) print(res) # 输出:Counter({'1': 3, '2': 3, '3': -3})
两种方案都可以正常保留相减后的零值与负值,根据使用场景选择即可。
内容的提问来源于stack exchange,提问作者Abhist
相关产品推荐
相关产品推荐

