我使用嵌套的 defaultdict 來保持代碼干凈并減少冗余代碼。
我正在構建一個字典,例如:
{"Store1": {"Product1": 1}, "Store2": {"Product1": 2, "Product2": 1}}
我試圖用 defaults實作這個問題的答案Nested dictionary,這會引發例外:
AttributeError: 'int' object has no attribute 'items'
from collections import defaultdict, Counter
d = defaultdict(lambda: defaultdict(lambda: Counter()))
d["Store1"]["Product1"] = 1
print(d)
無論如何我可以例如:
d["Store1"]["Product1"] = 1
uj5u.com熱心網友回復:
當您使用以下
d = defaultdict(lambda: defaultdict(lambda: Counter()))
d["Store1"]["Product1"] = 1
然后,d["Store1"]將創建一個“type”的新元素,defaultdict(lambda: Counter())從而d["Store1"]["Product1"]創建一個新的 type 元素Counter。因此,當您這樣做時 = 1,它會嘗試通過 來擴充Counter物件1。但是,這沒有定義,因為型別不兼容:
>>> 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協議,并嘗試將 rhs 計數添加到自己的計數中。即類似:
>>> 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。
uj5u.com熱心網友回復:
你需要寫這樣的東西
from collections import defaultdict, Counter
d = defaultdict(lambda: defaultdict(lambda: Counter()))
d["A"]["B"]["Store1"] = 1
print(d)
uj5u.com熱心網友回復:
我認為你defaultdict定義了一個太多的s。以下作業正常:
d = defaultdict(lambda: Counter())
d["Store1"]["Product1"] = 1
print(d)
輸出:
{'Store1': {'Product1': 1}}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/375708.html
