Ich habe eine Liste von Strings, die von irgendwo im folgenden Format analysiert werden:
%Vor%Ich möchte ein Wörterbuch basierend auf dieser Liste erstellen:
%Vor% Eine gewöhnliche for
-Schleife mit Index-Offsets würde wahrscheinlich den Trick machen, aber ich frage mich, ob es eine pythonische Art gibt, dies zu tun. Listenkompromittierungen scheinen interessant, aber ich kann nicht herausfinden, wie man sie auf dieses spezielle Problem anwendet.
Irgendwelche Ideen?
Sie können versuchen:
%Vor% Erklärung: Wir teilen die Liste in zwei Listen auf, eine der geraden und einer der ungeraden Elemente, indem wir sie in Zweierschritten beginnend vom ersten oder zweiten Element nehmen (das ist l[::2]
und l[1::2]
). Dann verwenden wir das zip
Built-in zu den zwei Listen in eine Liste von Paaren. Schließlich rufen wir dict
auf, um aus diesen Schlüssel / Wert-Paaren ein Wörterbuch zu erstellen.
Dies ist ~4n
in time und ~4n
im Raum, einschließlich des endgültigen Wörterbuchs. Es ist jedoch wahrscheinlich schneller als eine Schleife, da die Operatoren zip
, dict
und Slicing in C geschrieben sind.
Eine gute Gelegenheit, mein Lieblings-Python-Idiom anzuzeigen:
%Vor% Diese knifflige Zeile übergibt zwei Argumente an zip()
, wobei jedes Argument der selbe Iterator über S ist. zip()
erstellt 2-Item-Tupel, wobei jedesmal vom Iterator über Zip gezogen wird. dict()
konvertiert dann diese Tupel in ein Wörterbuch.
Um zu extrapolieren:
%Vor%Zusätzlich zu pavpanchekhas kurzer und vollkommen feiner Lösung können Sie einen Generatorausdruck verwenden (eine List Comprehensions ist nur ein Generatorausdruck, der dem Listenkonstruktor zugeführt wird - er ist tatsächlich leistungsfähiger und universell) für zusätzliche Güte:
%Vor%Abgesehen davon, dass es wirklich cool und funktional ist, ist es auch ein besserer Algorithmus: Wenn die Implementierung von dict nicht besonders dumm ist (unwahrscheinlich, dass es eingebaut ist), verbraucht das für jede Größe von l dieselbe Menge an Speicher läuft in konstantem aka O (1) Raum, da es ein Paar auf einmal verarbeitet, anstatt zuerst eine ganz neue Liste von Tupeln zu erstellen.
grouper
ist eine Funktion, die Paare in einer Liste bildet, die in iertools receips angegeben ist :
dict
nimmt eine Liste von (key,value)
Paaren und erstellt daraus ein Diktat.
Sie könnten auch result = dict(zip(*[iter(L)]*2))
schreiben und die meisten Leser verwirren: -)
Tags und Links python list-comprehension