2016-11-21 6 views
1

Der Fehler kommt von publishDB = defaultdict(defaultdict({})) Ich möchte eine Datenbank wie {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}}} machen. Ich habe versucht, es als DB[math][10001] = a dict zu bevölkern und später als d = DB[math][10001] vorgelesen. Da ich auf meinem Bürocomputer bin kann ich kein anderes Modul ausprobieren.TypeError: erstes Argument muss aufrufbar sein, defaultdict

Bin ich auf dem richtigen Weg, dies zu tun?

+0

Versuch 'dict' statt' {} 'vielleicht? –

Antwort

2

defaultdict() erfordert, dass das erste Argument aufrufbar sein muss: Es muss eine Klasse sein, die eine Instanz von oder eine Funktion haben soll, die eine Instanz zurückgibt.

defaultdict({}) hat ein leeres Wörterbuch, das nicht aufrufbar ist.

Wahrscheinlich möchten Sie defaultdict(dict), da dict eine Klasse ist, die ein Wörterbuch zurückgibt, wenn es instanziiert (genannt) wird.

Aber das löst das Problem immer noch nicht ... verschiebt es einfach auf ein anderes Niveau. Die äußere defaultdict(...) in defaultdict(defaultdict(dict)) hat genau das gleiche Problem, weil defaultdict(dict) nicht aufrufbar ist.

können Sie verwenden, um einen lambda Ausdruck dieses Problem zu lösen, eine einzeilige Funktion erstellen, die, wenn sie aufgerufen wird, ein defaultdict(dict) erstellt:

defaultdict(lambda: defaultdict(dict)) 

Sie auch das Lambda auf der unteren Ebene verwenden könnte, wenn man will:

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

das ist ein Teil des Problems, aber es ist nicht alles. das funktioniert auch nicht: 'publishDB = defaultdict (defaultdict (dict))' weil 'defaultdict (dict)' als erstes Argument für das äußere dict übergeben wird und auch nicht aufrufbar ist. –

+0

Korrekt, aktualisiert – kindall

3

eine solche verschachtelte dict Struktur kann unter Verwendung eines rekursiven defaultdict "Baum" erreicht werden:

def tree(): 
    return defaultdict(tree) 

publishDB = tree() 

Auf jeder Ebene werden die defaultdict mit tree instanziiert, die wie erforderlich ein Argument mit Nullargument ist. Dann können Sie einfach zuordnen Noten:

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