Stellen Sie sich vor, Sie haben:
keys = ['name', 'age', 'food']
values = ['Monty', 42, 'spam']
Was ist der einfachste Weg, um das folgende Wörterbuch zu erstellen?
a_dict = {'name' : 'Monty', 'age' : 42, 'food' : 'spam'}
python
list
dictionary
Guido
quelle
quelle
dictionary = {zip(keys, values)}
das nicht funktioniert. Sie müssen ausdrücklich erklären alsdict(...)
{thing}
ist syntaktischer Zucker, um einset()
Element zu konstruieren, das ein Element enthält.{*iterable}
ist syntaktischer Zucker, um einset
Element zu konstruieren, das mehrere Elemente enthält.{k:v}
oder{**mapping}
wird ein konstruierendict
, aber das ist syntaktisch ziemlich verschieden.{}
für Wörterbücher verwende. In der Tat, wenn wir versuchen, isttype({})
die Ausgabedict
. Aber in der Tat, wenn wir es versuchen,type({thing})
dann ist die Ausgabeset
.{k:v for k, v in zip(keys, values)}
. Es stellt sich heraus, dass wir es können. +1.Am performantesten,
dict
Konstruktor mitzip
In Python 3 gibt zip jetzt einen faulen Iterator zurück, und dies ist jetzt der performanteste Ansatz.
dict(zip(keys, values))
erfordert jeweils die einmalige globale Suche fürdict
undzip
, bildet jedoch keine unnötigen Zwischendatenstrukturen oder muss sich mit lokalen Suchvorgängen in der Funktionsanwendung befassen.Zweiter, Diktatverständnis:
Ein enger Zweitplatzierter bei der Verwendung des Diktatkonstruktors ist die Verwendung der nativen Syntax eines Diktatverständnisses (kein Listenverständnis , wie andere es fälschlicherweise ausgedrückt haben):
Wählen Sie diese Option, wenn Sie basierend auf den Schlüsseln oder dem Wert zuordnen oder filtern müssen.
Gibt in Python 2
zip
eine Liste zurück, um zu vermeiden, dass eine unnötige Liste erstellt wird. Verwenden Sieizip
stattdessen (Alias auf Zip kann Codeänderungen reduzieren, wenn Sie zu Python 3 wechseln).Das ist also immer noch (2.7):
Python 2, ideal für <= 2.6
izip
fromitertools
wirdzip
in Python 3.izip
ist besser als zip für Python 2 (da es die unnötige Listenerstellung vermeidet) und ideal für 2.6 oder niedriger:Ergebnis für alle Fälle:
Auf alle Fälle:
Erläuterung:
Wenn wir uns die Hilfe
dict
ansehen, sehen wir, dass es verschiedene Formen von Argumenten gibt:Der optimale Ansatz besteht darin, eine Iterable zu verwenden und gleichzeitig unnötige Datenstrukturen zu vermeiden. In Python 2 erstellt zip eine unnötige Liste:
In Python 3 wäre das Äquivalent:
und Python 3
zip
erstellt lediglich ein iterierbares Objekt:Da wir vermeiden möchten, unnötige Datenstrukturen zu erstellen, möchten wir normalerweise Python 2 vermeiden
zip
(da dadurch eine unnötige Liste erstellt wird).Weniger performante Alternativen:
Dies ist ein Generatorausdruck, der an den Diktatkonstruktor übergeben wird:
oder äquivalent:
Und dies ist ein Listenverständnis, das an den Diktatkonstruktor weitergegeben wird:
In den ersten beiden Fällen wird eine zusätzliche Schicht nicht operativer (daher unnötiger) Berechnungen über die iterierbare Zip-Datei gelegt, und im Fall des Listenverständnisses wird unnötigerweise eine zusätzliche Liste erstellt. Ich würde erwarten, dass alle weniger performant sind, und schon gar nicht mehr.
Leistungsbeurteilung:
In 64-Bit-Python 3.8.2 von Nix unter Ubuntu 16.04, geordnet vom schnellsten zum langsamsten:
dict(zip(keys, values))
gewinnt auch mit kleinen Sätzen von Schlüsseln und Werten, aber bei größeren Sätzen werden die Leistungsunterschiede größer.Ein Kommentator sagte:
Wir verwenden,
min
weil diese Algorithmen deterministisch sind. Wir wollen die Leistung der Algorithmen unter den bestmöglichen Bedingungen kennen.Wenn das Betriebssystem aus irgendeinem Grund hängt, hat es nichts mit dem zu tun, was wir vergleichen möchten. Daher müssen wir diese Art von Ergebnissen von unserer Analyse ausschließen.
Wenn wir
mean
diese Art von Ereignissen verwenden , werden unsere Ergebnisse stark verzerrt, und wenn wir sie verwenden, erhaltenmax
wir nur das extremste Ergebnis - das wahrscheinlichste, das von einem solchen Ereignis betroffen ist.Ein Kommentator sagt auch:
Ich nehme an, wir meinen
dict(zip(...
mit 10.000 Zufallszahlen. Das klingt nach einem ziemlich ungewöhnlichen Anwendungsfall. Es ist sinnvoll, dass die direktesten Anrufe in großen Datenmengen dominieren, und ich wäre nicht überrascht, wenn die Betriebssystem-Hänge dominieren würden, wenn man bedenkt, wie lange es dauern würde, diesen Test auszuführen und Ihre Zahlen weiter zu verzerren. Und wenn Sie verwendenmean
odermax
ich würde Ihre Ergebnisse für bedeutungslos halten.Verwenden wir für unsere Top-Beispiele eine realistischere Größe:
Und wir sehen hier, dass
dict(zip(...
bei größeren Datensätzen tatsächlich um etwa 20% schneller läuft.quelle
dict(zip(headList, textList))
Mikrosekunden für & 1,95 \ pm 0,030 Mikrosekunden für zurück{k: v for k, v in zip(headList, textList)}
. Ersteres würde ich aus Gründen der Lesbarkeit und Geschwindigkeit vorschlagen. Offensichtlich kommt dies zum Argument min () vs mean () für timeit.min
scheint ein schlechter Weg zu sein, um die Leistung zu vergleichen. Sicherlichmean
und / odermax
wären viel nützlichere Indikatoren für den tatsächlichen Gebrauch.dict
Anruf etwa 10% schneller.Versuche dies:
In Python 2 ist der Speicherverbrauch im Vergleich zu wirtschaftlicher
zip
.quelle
zip
ist der Speicherverbrauch bereits sparsam. docs.python.org/3/library/functions.html#zip In der Tat kann man sehen , dasssix
Anwendungenzip
in Python 3 zu ersetzen ,itertools.izip
in 2 Python pythonhosted.org/six .quelle
Sie können auch Wörterbuchverständnisse in Python ≥ 2.7 verwenden:
quelle
Ein natürlicherer Weg ist die Verwendung des Wörterbuchverständnisses
quelle
dict
Objekt zu konvertieren . Warum ist es so? Danke, Alter.Wenn Sie Schlüssel oder Werte transformieren müssen, bevor Sie ein Wörterbuch erstellen, kann ein Generatorausdruck verwendet werden. Beispiel:
Schauen Sie sich Code Like a Pythonista an: Idiomatic Python .
quelle
Mit Python 3.x geht es um das Verständnis von Diktaten
Mehr zum Diktatverständnis hier , ein Beispiel gibt es:
quelle
Für diejenigen, die einfachen Code benötigen und nicht vertraut sind mit
zip
:Dies kann durch eine Codezeile erfolgen:
quelle
List1
länger alsList2
for n in range(len(List1))
ist ein Anti-MusterDie beste Lösung ist immer noch:
Übertragen Sie es:
quelle
Sie können diesen folgenden Code verwenden:
Stellen Sie jedoch sicher, dass die Länge der Listen gleich ist. Wenn die Länge nicht gleich ist, drehen Sie die Zip-Funktion um die längere.
quelle
Ich hatte diesen Zweifel, als ich versuchte, ein grafisches Problem zu lösen. Das Problem, das ich hatte, war, dass ich eine leere Adjazenzliste definieren musste und alle Knoten mit einer leeren Liste initialisieren wollte. Dann dachte ich, ich würde prüfen, ob es schnell genug ist. Ich meine, ob es sich lohnt, eine Zip-Operation durchzuführen eher als einfaches Zuweisungsschlüssel-Wert-Paar. Schließlich ist der Zeitfaktor meistens ein wichtiger Eisbrecher. Also habe ich für beide Ansätze eine zeitliche Operation durchgeführt.
Für n_nodes = 10.000.000 bekomme ich,
Iteration: 2.825081646999024 Kurzform: 3.535717916001886
Iteration: 5.051560923002398 Kurzform: 6.255070794999483
Iteration: 6.52859034499852 Kurzform: 8.221581164998497
Iteration: 8.683652416999394 Kurzschrift: 12.599181543999293
Iteration: 11.587241565001023 Kurzform: 15.27298851100204
Iteration: 14.816342867001367 Kurzschrift: 17.162912737003353
Iteration: 16.645022411001264 Kurzschrift: 19.976680120998935
Sie können deutlich sehen, dass nach einem bestimmten Punkt der Iterationsansatz im n-ten Schritt die Zeit übersteigt, die der Kurzansatz im n-1-ten Schritt benötigt.
quelle
Hier ist auch ein Beispiel für das Hinzufügen eines Listenwerts in Ihrem Wörterbuch
Stellen Sie immer sicher, dass sich Ihr "Schlüssel" (Liste1) immer im ersten Parameter befindet.
quelle
Lösung als Wörterbuchverständnis mit Aufzählung:
Lösung wie für Schleife mit Aufzählung:
quelle
Sie können es auch mit einer Liste versuchen, die eine Kombination aus zwei Listen ist;)
quelle
Methode ohne Zip-Funktion
quelle