使用嵌套defaultdict触发AttributeError异常该如何解决?
错误原因
你当前代码的最内层默认类型设置为Counter,直接对d["Store1"]["Product1"]执行+=1操作时,会把默认生成的Counter实例覆盖为int类型数值,后续打印或访问该属性时触发Counter的内置方法调用,进而抛出属性错误。
解决方案
你需要的是两层嵌套字典、最内层存储计数值的结构,有两种可行方案都可以支持d["Store1"]["Product1"] += 1的写法:
方案1:嵌套defaultdict,最内层默认值为int
该方案生成的结构和你要求的目标完全一致,无需额外转换:
from collections import defaultdict d = defaultdict(lambda: defaultdict(int)) # 测试赋值 d["Store1"]["Product1"] += 1 d["Store2"]["Product1"] += 2 d["Store2"]["Product2"] += 1 # 输出验证 print(dict(d)) # 运行结果:{'Store1': {'Product1': 1}, 'Store2': {'Product1': 2, 'Product2': 1}}
方案2:defaultdict搭配Counter(适合需要统计功能的场景)
如果你后续需要用到计数排序、高频统计等Counter的内置功能,可以用该方案:
from collections import defaultdict, Counter d = defaultdict(Counter) # 测试赋值写法完全一致 d["Store1"]["Product1"] += 1 d["Store2"]["Product1"] += 2 d["Store2"]["Product2"] += 1 # 转成普通字典即可匹配目标结构 print({k: dict(v) for k, v in d.items()}) # 运行结果:{'Store1': {'Product1': 1}, 'Store2': {'Product1': 2, 'Product2': 1}}
内容的提问来源于stack exchange,提问作者coredumped0x
相关产品推荐
相关产品推荐

