TypeError:第一个参数必须是可调用的,defaultdict

时间:2016-11-21 04:26:05

标签: python defaultdict

错误来自publishDB = defaultdict(defaultdict({}))我想创建像{subject1:{student_id:{assignemt1:marks, assignment2:marks,finals:marks}} , {student_id:{assignemt1:marks, assignment2:marks,finals:marks}}, subject2:{student_id:{assignemt1:marks, assignment2:marks,finals:marks}} , {student_id:{assignemt1:marks, assignment2:marks,finals:marks}}}这样的数据库。我试图将其填充为DB[math][10001] = a dict,然后将其读作d = DB[math][10001]。因为,我在办公室电脑上,我不能尝试不同的模块。

我是否正确地这样做?

2 个答案:

答案 0 :(得分:3)

这样的嵌套dict结构可以使用递归defaultdict"树"来实现:

def tree(): 
    return defaultdict(tree)

publishDB = tree()

在每个级别,默认分区都使用tree实例化,这是一个零参数可调用,如果需要。 然后你可以简单地指定标记:

publishDB[subject][student][assignment] = mark

答案 1 :(得分:2)

defaultdict()要求其第一个参数是可调用的:它必须是您想要实例的类,或者是返回实例的函数。

defaultdict({})有一个空字典,不可调用。

您可能需要defaultdict(dict),因为dict是一个在实例化(调用)时返回字典的类。

但这仍然无法解决问题...只是将其移至不同的水平。 defaultdict(...)中的defaultdict(defaultdict(dict))外部defaultdict(dict)具有完全相同的问题,因为lambda无法调用。

您可以使用defaultdict(dict)表达式来解决此问题,创建一个单行函数,在调用时创建 defaultdict(lambda: defaultdict(dict))

defaultdict(lambda: defaultdict(lambda: {}))

如果您愿意,也可以在较低级别使用lambda:

$graphLookup