2016-11-21 9 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(dict)は呼び出し可能ではないため、defaultdict(...)defaultdict(defaultdict(dict))には全く同じ問題があります。

あなたはと呼ばれる、1行の関数を作成、これを解決するlambda表現を使用することができ、defaultdict(dict)を作成します。

defaultdict(lambda: defaultdict(dict)) 

あなたが望んだ場合にも低いレベルでラムダを使用することができます。

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

これは問題の一部ですが、すべてではありません。 'defaultdict(dict)'が外側のdictの最初の引数として渡されているため、 'publishDB = defaultdict(defaultdict(dict))'のどちらも呼び出されません。 –

+0

正解、更新済み – kindall

3

このようなネストされたdict構造は再帰defaultdict "木" を使用して達成することができる。

def tree(): 
    return defaultdict(tree) 

publishDB = tree() 

各レベルで、defaultdictはtreeでインスタンス化され、必要に応じて引数のない呼び出し可能です。 そして、あなたは、単にマーク割り当てることができます?

publishDB[subject][student][assignment] = mark 
関連する問題