python - 默认字典 : first argument must be callable or None

标签 python defaultdict

我运行了以下代码:

from collections import defaultdict
lst = list(range(0,5))
d = defaultdict(lst)

我得到了这个错误:

TypeError: first argument must be callable or None

请帮忙

最佳答案

对于defaultdict默认值通常不是真正的值,它是一个工厂:一个方法产生新的值(value)。您可以使用生成列表的 lambda 表达式 解决此问题:

lst = <b>lambda:</b>list(range(0,5))
d = defaultdict(lst)

这也是一个好主意,因为否则所有默认值引用相同的列表。例如这里:

d[1].append(14)

不会d[2] 产生影响(给定 d[1]d[2]不存在)。

可以通过以下方式实现:

val = list(range(0,5))
lst = lambda:val
d = defaultdict(lst)

但这可能会产生不需要的副作用:如果您在这里执行 d[1].append(14) 那么 d[2] 将是 [1 ,2,3,4,5,14] 并且 d[1] is d[2] 将为 True:

$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from collections import defaultdict
>>> val = list(range(0,5))
>>> lst = lambda:val
>>> d = defaultdict(lst)
>>> d[1]
[0, 1, 2, 3, 4]
>>> d[1].append(14)
>>> d[2]
[0, 1, 2, 3, 4, 14]
>>> d[1] is d[2]
True

鉴于:

$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from collections import defaultdict
>>> lst = lambda:list(range(0,5))
>>> d = defaultdict(lst)
>>> d[1]
[0, 1, 2, 3, 4]
>>> d[1].append(14)
>>> d[2]
[0, 1, 2, 3, 4]
>>> d[1] is d[2]
False

关于python - 默认字典 : first argument must be callable or None,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42137849/

相关文章:

python - 如何从 QGraphicsScene 中删除 QRect

python - 使用自定义状态代码在 Python Bottle 中发送字典作为响应

python - Protobuf 消息构造器

python - 不能 pickle 默认字典

python - 在初始化时填充一个 defaultdict

python - 将 .map 与 defaultdict 一起使用

python - 使用 pandas read_csv 读取缺失日期的最安全方法——给定的空格会变成今天的日期错误

python - 给定 x 和 y 值时旋转的密度网格图 (Python)

python - 在python中对相似值进行分组和求和

python - DataFrame 来自多个字典的列表,其中键是索引,值是列数据