2016-11-21 141 views
1

错误来自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]的形式读出。因为,我在我的办公室电脑上,我不能尝试不同的模块。TypeError:第一个参数必须是可调用的,defaultdict

我在正确的轨道上这样做吗?

+0

试试'dict'而不是'{}'也许? –

回答

2

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

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

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

但是,这仍然不能解决问题...只是把它移动到不同的水平。 defaultdict(defaultdict(dict))中的外部defaultdict(...)具有完全相同的问题,因为defaultdict(dict)不可调用。

可以使用lambda表达式来解决这个问题,创建一个行函数,调用它时,会创建一个defaultdict(dict)

defaultdict(lambda: defaultdict(dict)) 

您也可以使用拉姆达在较低的水平,如果你想要的东西:

defaultdict(lambda: defaultdict(lambda: {})) 
+0

这是问题的一部分,但并非全部。这也不起作用:'publishDB = defaultdict(defaultdict(dict))''因为'defaultdict(dict)'作为外部字典的第一个参数传递,并且它也不可调用。 –

+0

正确,更新 – kindall

3

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

def tree(): 
    return defaultdict(tree) 

publishDB = tree() 

在每个级别,defaultdicts都会根据需要用tree实例化,这是一个零参数可调用的。 然后你可以简单地分配标记:

publishDB[subject][student][assignment] = mark 
相关问题