如何比较两个collections.defaultdict,删除d1中与d2键重合的全部条目
问题原因说明
Counter类型默认的-运算是对两个对象的同键值做算术减法,仅会移除最终值小于等于0的键,所以你操作后hi键还保留了差值12,不符合「只要d2存在该键就完全移除」的需求。
实现方法
方法1:字典推导式(兼容性最高,支持Counter/defaultdict/普通字典)
适合需要保留原d1、d2数据的场景,生成新的目标对象:
from collections import Counter, defaultdict d1 = Counter({'hi': 22, 'bye': 55, 'ok': 33}) d2 = Counter({'hi': 10, 'hello': 233, 'nvm': 96}) # 生成符合要求的Counter d3 = Counter({k: v for k, v in d1.items() if k not in d2}) # 如果是defaultdict场景,改用如下写法 # d3 = defaultdict(int, {k: v for k, v in d1.items() if k not in d2}) print(d3) # 输出:Counter({'bye': 55, 'ok': 33})
方法2:键集合差集构造
利用字典键视图的集合运算特性,逻辑更直观:
d3 = Counter({k: d1[k] for k in d1.keys() - d2.keys()})
方法3:原地修改d1(无需保留原d1时使用)
直接遍历d2的键从d1中删除,性能更高:
for k in d2: # pop第二个参数为None,避免d1无对应键时报错 d1.pop(k, None) # 此时d1就是目标结果
内容的提问来源于stack exchange,提问作者maximus
相关产品推荐
相关产品推荐

