Bei meinem Versuch, ein Listenwörterbuch programmgesteuert zu erstellen, kann ich Wörterbuchschlüssel nicht einzeln adressieren. Immer wenn ich das Listenwörterbuch erstelle und versuche, es an einen Schlüssel anzuhängen, werden alle aktualisiert. Hier ist ein sehr einfacher Testfall:
data = {}
data = data.fromkeys(range(2),[])
data[1].append('hello')
print data
Tatsächliche Ergebnis: {0: ['hello'], 1: ['hello']}
Erwartetes Ergebnis: {0: [], 1: ['hello']}
Hier ist was funktioniert
data = {0:[],1:[]}
data[1].append('hello')
print data
Tatsächliches und erwartetes Ergebnis: {0: [], 1: ['hello']}
Warum fromkeys
funktioniert die Methode nicht wie erwartet?
quelle
fromkeys()
Methode stattdessen eine Factory-Funktion akzeptiert, damit wir sielist
als Funktion übergeben können und diese Funktion für jeden erstellten Schlüssel einmal aufgerufen wird, aber das ist nicht die eigentliche API vondict.fromkeys()
.Verwenden Sie stattdessen defaultdict :
Auf diese Weise müssen Sie nicht alle Schlüssel, die Sie für Listen verwenden möchten, vorher initialisieren.
In Ihrem Beispiel verwenden Sie eine (veränderbare) Liste:
würde ausgeben
{0: [1, 2], 1: [1, 2]}
.quelle
list
hier keine leere Liste, sondern ein Typ ist (oder Sie können es als aufrufbaren Konstruktor sehen, denke ich). Jedes Mal, wenn ein fehlender Schlüssel übergeben wird, wird eine neue Liste erstellt, anstatt denselben erneut zu verwenden.Sie füllen Ihre Wörterbücher mit Verweisen auf eine einzelne Liste. Wenn Sie sie aktualisieren, wird die Aktualisierung in allen Verweisen wiedergegeben. Versuchen Sie stattdessen ein Wörterbuchverständnis. Siehe Erstellen eines Wörterbuchs mit Listenverständnis in Python
quelle
v
in dieser Antwort?Sie könnten dies verwenden:
quelle