首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套defaultdict引发AttributeError

嵌套defaultdict引发AttributeError
EN

Stack Overflow用户
提问于 2021-12-06 20:49:09
回答 2查看 48关注 0票数 0

我使用嵌套的defaultdict来保持代码的整洁,减少冗余代码。

我正在编制一本字典,例如:

代码语言:javascript
复制
{"Store1": {"Product1": 1}, "Store2": {"Product1": 2, "Product2": 1}}

我试图实现这个问题Nested dictionary with defaults的答案,这将引发例外情况:

代码语言:javascript
复制
AttributeError: 'int' object has no attribute 'items'
代码语言:javascript
复制
from collections import defaultdict, Counter

d = defaultdict(lambda: defaultdict(lambda: Counter()))
d["Store1"]["Product1"] += 1
print(d)

例如,我是否可以:

代码语言:javascript
复制
d["Store1"]["Product1"] += 1
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-06 21:06:06

当您使用以下内容时

代码语言:javascript
复制
d = defaultdict(lambda: defaultdict(lambda: Counter()))
d["Store1"]["Product1"] += 1

然后,d["Store1"]将创建一个" type“defaultdict(lambda: Counter())的新元素,因此d["Store1"]["Product1"]将创建一个类型为Counter的新元素。因此,当您执行+= 1时,它尝试通过1来增强Counter对象。但是,由于这些类型不兼容,所以没有定义:

代码语言:javascript
复制
>>> c = Counter()
>>> c += 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/---/lib/python3.7/collections/__init__.py", line 832, in __iadd__
    for elem, count in other.items():
AttributeError: 'int' object has no attribute 'items'

正如您可以看到的,它假设右侧遵循Mapping协议,并尝试添加r.h.s。它自己也算。例如:

代码语言:javascript
复制
>>> c = Counter(a=1)
>>> c += Counter(a=2, b=3)
>>> c
Counter({'a': 3, 'b': 3})

另一方面,当您使用defaultdict(lambda: defaultdict(int))时,d["Store1"]["Product1"]会创建一个新的int对象,这个对象可以由+= 1递增并写回dict。

票数 1
EN

Stack Overflow用户

发布于 2021-12-06 21:00:25

你需要写些这样的东西

代码语言:javascript
复制
from collections import defaultdict, Counter

d = defaultdict(lambda: defaultdict(lambda: Counter()))
d["A"]["B"]["Store1"] += 1
print(d)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70251789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档