Pythonischer Weg, um eine Liste von Strings in ein Dictionary mit den ungeraden indizierten Strings als Schlüssel und den geradzahligen Strings als Werten umzuwandeln?

8

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?

    
KennyDeriemaeker 21.07.2010, 19:49
quelle

5 Antworten

13

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.

    
pavpanchekha 21.07.2010, 19:50
quelle
5

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%     
Triptych 21.07.2010 20:21
quelle
3
%Vor%     
unutbu 21.07.2010 19:56
quelle
1

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.

    
delnan 21.07.2010 20:09
quelle
0
%Vor%

grouper ist eine Funktion, die Paare in einer Liste bildet, die in iertools receips angegeben ist :

%Vor%

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: -)

    
Jochen Ritzel 21.07.2010 19:52
quelle

Tags und Links