2011-01-03 5 views
1

Lassen Sie sich sagen, dass ich eine Datei wie diese habe (so tun, als es eine Matrix war):Liste Verständnis ausgewählte Indizes

abcde 
fghik 
lmnop 

Ich möchte dies in einer 2D-Liste setzen, aber mit nur Spalten bis zu Index 3:

# 0 1 2 3 
[['a','b','c','d'], 
    ['f','g','h','i'], 
    ['l','m','n','o']] 

Wie macht man das mit einem Listenverständnis? Ich weiß, ich könnte eine Schleife machen, aber ich suche einen saubereren Weg.

Ich könnte auch enumerate/wenn in der inneren Liste Verständnis für Spalte zu überprüfen. Ist das der sauberste?

Antwort

7

Wenn ich die Frage richtig verstehe, sollte dies funktionieren (aber vielleicht bin ich über die Vereinfachung). Beachten Sie die [4] im inneren Verständnis:

f = open('file.txt') 
lines = f.readlines() 
matrix = [[a for a in b[:4]] for b in lines] # this gets all columns, up to 4 
+0

Tatsächlich tut es das. Das Schneiden vergessen! – ash

3

Scheibe jede Zeile bis zur 3. Säule: matrix = [[a for a in b][:3] for b in lines]

+0

besser noch: 'Matrix = [b [3] für b in Zeilen]' – albertov

+0

Die Sie aber eine Liste von Strings gibt, nicht eine Liste von Listen. – sepp2k

+0

Sie können einfach 'list (b [: 3])' (oder zumindest verschieben Sie die '[: 3]' innerhalb der Listcomp, auf 'b', so dass Sie nicht den Rest von' b' replizieren). – delnan

2

„aber nur mit Spalten bis zu 3“? Was soll das heißen? Bedeuten Sie anhand Ihres Beispiels "nur die ersten vier Spalten"? Wenn das der Fall ist, einfach:

with f as open('file.txt'): 
    matrix = [list(line[:4]) for line in f] 

Aufruf readlines nicht erforderlich ist (noch schlimmer, schädlich, da es viel Speicher für große Dateien verbraucht), können Sie die Zeilen iterieren nur Datei.

+0

Entschuldigung, die Spalten waren nullindiziert. Danke für den Hinweis auf Readlines, ich werde es mir merken (obwohl für mein Problem kein Problem). – ash

+0

@Jasie: Es mag jetzt kein Problem sein, aber man weiß nie, wie sich die Dinge in Zukunft ändern könnten;) Außerdem ist der Code * kürzer * und * besser lesbar * auf diese Weise - es gibt sehr, sehr selten einen Grund zu benutzen ' readlines' (und selbst dann, 'list (file)' macht dasselbe). – delnan

+0

Ich verstehe. Gibt es einen Effizienzunterschied zwischen 'list (file)' und 'readlines()'? – ash