Ist es möglich, ein Wörterbuchverständnis in Python (für die Schlüssel) zu erstellen?
Ohne Listenverständnis können Sie Folgendes verwenden:
l = []
for n in range(1, 11):
l.append(n)
Wir können dies auf ein Listenverständnis verkürzen : l = [n for n in range(1, 11)]
.
Angenommen, ich möchte die Schlüssel eines Wörterbuchs auf denselben Wert setzen. Ich kann:
d = {}
for n in range(1, 11):
d[n] = True # same value for each
Ich habe das versucht:
d = {}
d[i for i in range(1, 11)] = True
Allerdings bekomme ich eine SyntaxError
auf die for
.
Darüber hinaus (ich brauche diesen Teil nicht, sondern frage mich nur) können Sie die Schlüssel eines Wörterbuchs auf eine Reihe verschiedener Werte festlegen, wie folgt:
d = {}
for n in range(1, 11):
d[n] = n
Ist dies mit einem Wörterbuchverständnis möglich?
d = {}
d[i for i in range(1, 11)] = [x for x in range(1, 11)]
Dies wirft auch eine SyntaxError
auf die for
.
python
dictionary
list-comprehension
Rushy Panchal
quelle
quelle
Antworten:
In Python 2.7+ gibt es Wörterbuchverständnisse , die jedoch nicht so funktionieren, wie Sie es versuchen. Wie ein Listenverständnis erstellen sie ein neues Wörterbuch. Sie können sie nicht zum Hinzufügen von Schlüsseln zu einem vorhandenen Wörterbuch verwenden. Außerdem müssen Sie die Schlüssel und Werte angeben, obwohl Sie natürlich auch einen Dummy-Wert angeben können, wenn Sie möchten.
Wenn Sie sie alle auf True setzen möchten:
Was Sie anscheinend verlangen, ist eine Möglichkeit, mehrere Schlüssel gleichzeitig in einem vorhandenen Wörterbuch festzulegen. Dafür gibt es keine direkte Abkürzung. Sie können entweder eine Schleife ausführen, wie Sie es bereits gezeigt haben, oder Sie können ein Wörterbuchverständnis verwenden, um ein neues Diktat mit den neuen Werten zu erstellen und dann
oldDict.update(newDict)
die neuen Werte mit dem alten Diktat zusammenzuführen.quelle
dict.update
kann ebenso wie derdict
Konstruktor eine Iterable von Schlüssel-Wert-Paaren akzeptierendict.fromkeys()
.True
Verwenden Sie also, um alle Werte auf zu setzendict.fromkeys(range(5), True)
. Beachten Sie, dass der Wert nicht kopiert wird. Sie können dies daher vermeiden, wenn Sie einen veränderlichen Wert haben. Es wird von allen Schlüsseln geteilt.{ n*2 : n for n in range(3) } => {0: 0, 2: 1, 4: 2}
. Beides kann im selben Ausdruck erfolgen :{ n*2 : n*3 for n in range(3) } => { 0: 0, 2: 3, 4: 6 }
.Sie können die
dict.fromkeys
Klassenmethode verwenden ...Dies ist der schnellste Weg, um ein Wörterbuch zu erstellen, in dem alle Schlüssel demselben Wert zugeordnet sind.
Aber Sie nicht verwenden , diese mit veränderbaren Objekten :
Wenn Sie nicht wirklich brauchen , um alle Tasten zu initialisieren, eine
defaultdict
könnte nützlich sein , wie auch:Um den zweiten Teil zu beantworten, ist ein Diktatverständnis genau das, was Sie brauchen:
Sie sollten dies wahrscheinlich nicht tun, aber Sie können auch eine Unterklasse erstellen,
dict
die wie eine funktioniert,defaultdict
wenn Sie überschreiben__missing__
:quelle
d = defaultdict(lambda: True)
das Lambda nicht erforderlich ist, da True veränderlich ist (oder nicht sein sollte).quelle
Ich mag den @ mgilson-Kommentar sehr, denn wenn Sie zwei Iterables haben, von denen eines den Schlüsseln und das andere den Werten entspricht, können Sie auch Folgendes tun.
geben
quelle
{i:j for i in keys for j in values}
Verwenden Sie dict () für eine Liste von Tupeln. Mit dieser Lösung können Sie in jeder Liste beliebige Werte festlegen, sofern diese dieselbe Länge haben
quelle
d = dict(zip(i_s,x_s))
Betrachten Sie dieses Beispiel zum Zählen des Auftretens von Wörtern in einer Liste mithilfe des Wörterbuchverständnisses
Und das Ergebnis ist
quelle
Der Hauptzweck eines Listenverständnisses besteht darin, eine neue Liste basierend auf einer anderen Liste zu erstellen, ohne die ursprüngliche Liste zu ändern oder zu zerstören.
Anstatt zu schreiben
oder
du solltest nur schreiben
In den beiden oberen Codeblöcken erstellen Sie eine neue Liste, durchlaufen diese und geben nur jedes Element zurück. Es ist nur eine teure Möglichkeit, eine Listenkopie zu erstellen.
Gehen Sie folgendermaßen vor, um ein neues Wörterbuch zu erhalten, bei dem alle Schlüssel basierend auf einem anderen Diktat auf denselben Wert eingestellt sind:
Sie erhalten einen SyntaxError, weil beim Schreiben
Sie sagen im Grunde: "Setzen Sie meinen Schlüssel 'i für i im Bereich (1, 11)' auf True" und "i für i im Bereich (1, 11)" ist kein gültiger Schlüssel, sondern nur ein Syntaxfehler. Wenn diktierte unterstützte Listen als Schlüssel diktieren, würden Sie so etwas tun
und nicht
Listen sind jedoch nicht hashbar, sodass Sie sie nicht als Diktierschlüssel verwenden können.
quelle
Sie können eine solche Liste nicht hashen. Versuchen Sie dies stattdessen, es werden Tupel verwendet
quelle