gpt4 book ai didi

python - 减少不适用于 collections.defaultdict?

转载 作者:太空宇宙 更新时间:2023-11-04 10:20:19 24 4
gpt4 key购买 nike

为什么 reduce() 在以下情况下不能使用 defaultdict 对象:

>>> from collections import defaultdict
>>> d = defaultdict(lambda: defaultdict(int))
>>> reduce(dict.get, [1,2], d)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: descriptor 'get' requires a 'dict' object but received a 'NoneType'

上面的reduce等价于d[1][2],所以我期望0,即默认返回值作为输出但我得到了一个 NoneType 异常。

如果我使用 d[1][2] 它工作正常,如下所示:

>>> d[1][2]
0

我做错了什么吗?

最佳答案

dict.get() 如果键不存在,则返回 None即使对于 defaultdict 对象也是如此 .

那是因为dict.get()工作 是在缺少键时返回默认值。如果没有,您将永远无法返回不同默认值(dict.get() 的第二个参数):

>>> from collections import defaultdict
>>> d = defaultdict(lambda: defaultdict(int))
>>> d.get(1, 'default')
'default'

换句话说,您的reduce(dict.get, ..) 函数等同于d[1][2]表达式。它等同于 d.get(1).get(2),它以完全相同的方式失败:

>>> d = defaultdict(lambda: defaultdict(int))
>>> d.get(1).get(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'get'

如果您想依赖自动插入行为,请改用 dict.__getitem__:

>>> reduce(dict.__getitem__, [1,2], d)
0

表达式 d[1] 直接转换为 d.__getitem__(1)

关于python - 减少不适用于 collections.defaultdict?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32652864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com