【问题标题】:TypeError: first argument must be callable, defaultdictTypeError:第一个参数必须是可调用的,defaultdict
【发布时间】:2017-04-04 09:50:48
【问题描述】:

错误来自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]。因为,我在我的办公室电脑上,所以我不能尝试不同的模块。

我这样做是否正确?

【问题讨论】:

  • 试试dict而不是{}也许?

标签: python defaultdict


【解决方案1】:

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

def tree(): 
    return defaultdict(tree)

publishDB = tree()

在每个级别,默认字典都根据需要使用tree 进行实例化,这是一个零参数可调用。 然后你可以简单地分配标记:

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

     defaultdict(lambda: defaultdict(dict))
    

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

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

    【讨论】:

    • 这是问题的一部分,但不是全部。这也不起作用:publishDB = defaultdict(defaultdict(dict)) 因为defaultdict(dict) 被作为外部字典的第一个参数传递,并且它也不能调用。
    猜你喜欢
    • 2017-06-27
    • 1970-01-01
    • 2021-03-20
    • 2020-08-31
    • 1970-01-01
    • 2020-03-29
    • 2017-05-08
    • 1970-01-01
    • 2018-08-11
    相关资源
    最近更新 更多