Ich möchte ein Wörterbuch erstellen, dessen Werte Listen sind. Beispielsweise:
{
1: ['1'],
2: ['1','2'],
3: ['2']
}
Wenn ich mache:
d = dict()
a = ['1', '2']
for i in a:
for j in range(int(i), int(i) + 2):
d[j].append(i)
Ich bekomme einen KeyError, weil d [...] keine Liste ist. In diesem Fall kann ich nach der Zuweisung von a den folgenden Code hinzufügen, um das Wörterbuch zu initialisieren.
for x in range(1, 4):
d[x] = list()
Gibt es einen besseren Weg, dies zu tun? Nehmen wir an, ich kenne die Schlüssel nicht, die ich benötigen werde, bis ich in der zweiten for
Schleife bin . Beispielsweise:
class relation:
scope_list = list()
...
d = dict()
for relation in relation_list:
for scope_item in relation.scope_list:
d[scope_item].append(relation)
Eine Alternative wäre dann das Ersetzen
d[scope_item].append(relation)
mit
if d.has_key(scope_item):
d[scope_item].append(relation)
else:
d[scope_item] = [relation,]
Was ist der beste Weg, um damit umzugehen? Im Idealfall würde das Anhängen "einfach funktionieren". Gibt es eine Möglichkeit auszudrücken, dass ich ein Wörterbuch mit leeren Listen möchte, auch wenn ich nicht jeden Schlüssel kenne, wenn ich die Liste zum ersten Mal erstelle?
quelle
collections
funktionieren beispielsweise auch andere Wörterbücher unter dem Modulcollections.OrderedDict
.NameError: name 'a' is not defined
Sie können es mit Listenverständnis wie folgt erstellen:
Und für den zweiten Teil Ihrer Frage verwenden Sie defaultdict
quelle
Sie können verwenden
setdefault
:Die ziemlich seltsam benannte
setdefault
Funktion sagt: "Holen Sie sich den Wert mit diesem Schlüssel, oder wenn dieser Schlüssel nicht vorhanden ist, fügen Sie diesen Wert hinzu und geben Sie ihn dann zurück."Wie andere zu Recht betont haben,
defaultdict
ist dies eine bessere und modernere Wahl.setdefault
ist in älteren Versionen von Python (vor 2.5) immer noch nützlich.quelle
Ihre Frage wurde bereits beantwortet, aber IIRC können Sie Zeilen ersetzen wie:
mit:
Das heißt,
d
Referenzend.keys()
in dieser Konstruktion. Manchmaldefaultdict
ist dies nicht die beste Option (zum Beispiel, wenn Sie mehrere Codezeilen nachelse
den oben genannten ausführen möchtenif
), und ich finde diein
Syntax leichter zu lesen.quelle
Persönlich verwende ich JSON nur, um Dinge in Strings und zurück zu konvertieren. Saiten verstehe ich.
quelle
einfacher Weg ist:
quelle