如何抑制collections.defaultdict查询缺失键时自动添加键?
解决defaultdict查询缺失键自动添加的问题
确实,defaultdict这个自动给缺失键赋值并添加到字典的特性,在很多场景下都挺闹心的——就像你说的,只是想查个键有没有对应的 value,结果字典里平白多了个没用的条目,还可能带来不必要的开销,尤其是简单计数这种场景,完全没必要用defaultdict的这个特性。
这里给你几个实用的解决方案:
1. 使用dict.get()方法(最推荐)
普通字典和defaultdict都支持get()方法,它会在键不存在时返回你指定的默认值,不会修改原字典。完美符合你的需求:
from collections import defaultdict d = defaultdict(int) res = d.get(5, 0) # 键5不存在,返回默认值0 print(d) # defaultdict(<class 'int'>, {}) # 字典保持为空,完全符合预期
如果是计数场景,想用普通字典替代defaultdict也很方便:
d = {} key = 3 d[key] = d.get(key, 0) + 1 # 自动给不存在的键初始化为0再加1,不会额外添加无用键
2. 先检查键是否存在再访问
如果你还是习惯用[]访问,可以先判断键是否在字典里:
from collections import defaultdict d = defaultdict(int) if 5 in d: res = d[5] else: res = 0 print(d) # defaultdict(<class 'int'>, {}) # 字典依然为空
这种方法逻辑直观,但代码稍微繁琐一点,不如get()简洁。
为什么defaultdict会自动加键?
顺便提一句,defaultdict的这个特性是因为它重写了__getitem__方法(也就是用[]访问元素的逻辑):当你访问不存在的键时,它会调用你指定的工厂函数(比如int()生成0),然后把这个键和生成的值一起插入字典,最后返回这个值。而get()方法不会触发这个插入逻辑,只是返回默认值而已。
内容的提问来源于stack exchange,提问作者jpp
相关产品推荐
相关产品推荐

