Wie erstelle ich ein Wörterbuch aus einer Textzeile?

8

Ich habe eine generierte Datei mit Tausenden von Zeilen wie folgt:

CODE,XXX,DATE,20101201,TIME,070400,CONDITION_CODES,LTXT,PRICE,999.0000,QUANTITY,100,TSN,1510000001

Einige Zeilen haben mehr Felder und andere weniger, aber alle folgen demselben Muster von Schlüssel / Wert-Paaren und jede Zeile hat ein TSN-Feld.

Wenn ich eine Analyse der Datei durchführte, schrieb ich eine Schleife wie die folgende, um die Datei in ein Wörterbuch zu lesen:

%Vor%

... das ist in Ordnung und macht genau das, was ich will (das print ist nur ein triviales Beispiel).

Allerdings fühlt es sich für mich und die Zeile mit:

nicht besonders "pythonisch" an %Vor%

Was fühlt sich einfach "klobig" an (wie oft iteriert es über die Felder?).

Gibt es einen besseren Weg, dies in Python 2.6 mit nur den Standardmodulen zu tun?

    
Johnsyweb 04.12.2010, 23:06
quelle

4 Antworten

18

In Python 2 könnten Sie izip im Modul itertools und die Magie von Generator-Objekten verwenden, um Ihre eigene Funktion zu schreiben, um die Erstellung von Wertepaaren für die dict Datensätze zu vereinfachen. Ich habe die Idee für pairwise() von einem gleichnamigen (aber funktional unterschiedlichen) Rezept bekommen in Python 2 itertools docs.

Um den Ansatz in Python 3 zu verwenden, können Sie einfach plain zip() verwenden, da es das tut, was izip() in Python 2 getan hat, was zu dessen Entfernung von itertools führt - das Beispiel unten behandelt dies und sollte in beiden funktionieren Versionen.

%Vor%

Welches kann so in Ihrer Datei verwendet werden: for loop:

%Vor%

Aber warten Sie, es gibt mehr!

Es ist möglich, eine verallgemeinerte Version zu erstellen. Ich rufe grouper() auf, was wiederum einem ähnlich benannten, aber funktionell unterschiedlichen itertools Rezept entspricht (welches direkt unter pairwise() aufgeführt ist):

%Vor%

Was könnte so in Ihrer for Schleife verwendet werden:

%Vor%

Natürlich ist es für spezielle Fälle wie diese einfach, functools.partial() zu verwenden und eine ähnliche pairwise() Funktion damit zu erstellen (was sowohl in Python 2 als auch in 3 funktioniert):

%Vor%

Postscript

Wenn nicht wirklich viele Felder vorhanden sind, können Sie stattdessen eine tatsächliche Sequenz aus den Paaren von Zeilenelementen erstellen (anstatt einen Generatorausdruck zu verwenden, der kein len() hat):

%Vor%

Sie könnten mit einer einfacheren Funktion grouper() auskommen:

%Vor%     
martineau 04.12.2010, 23:27
quelle
6

Nicht so viel besser als nur effizienter ...

Vollständige Erklärung

    
Ignacio Vazquez-Abrams 04.12.2010 23:12
quelle
2
%Vor%

Quelle

    
robert 04.12.2010 23:14
quelle
1

Wenn wir es sowieso zu einer Funktion zusammenfassen, ist es nicht schwer "von Grund auf" zu schreiben:

%Vor%

roberts Rezeptversion gewinnt jedoch definitiv Punkte für Flexibilität.

    
Karl Knechtel 04.12.2010 23:27
quelle

Tags und Links