5 Stimmen

Verschachtelung von Python-Listenauffassungen, um eine Liste von Listen zu erstellen

Ich bin ein Python-Neuling und habe Schwierigkeiten, verschachtelte Liste Auffassungen groking. Ich versuche, etwas Code zu schreiben, um in einer Datei zu lesen und eine Liste für jedes Zeichen für jede Zeile zu konstruieren.

Wenn die Datei also Folgendes enthält

xxxcd
cdcdjkhjasld
asdasdxasda

Die Liste würde wie folgt aussehen:

[
['x','x','x','c','d']
['c','d','c','d','j','k','h','j','a','s','l','d']
['a','s','d','a','s','d','x','a','s','d','a']
]

Ich habe den folgenden Code geschrieben, und es funktioniert, aber ich habe ein nörgelndes Gefühl, dass ich in der Lage sein sollte, eine verschachtelte Liste Verständnis zu schreiben, um dies in weniger Codezeilen zu tun. alle Vorschläge wäre geschätzt.

data = []
f = open(file,'r')
for line in f:
    line = line.strip().upper()
    list = []
    for c in line:
        list.append(c)
    data.append(list)

19voto

Edan Maor Punkte 9446

Das sollte helfen (Sie müssen wahrscheinlich ein wenig daran herumspielen, um die Zeilenumbrüche zu entfernen oder die Daten nach Ihren Wünschen zu formatieren, aber die Grundidee sollte funktionieren):

f = open(r"temp.txt")
[[c for c in line] for line in f]

3voto

E.M. Punkte 4309

In Ihrem Fall können Sie die list Konstruktor, um die innere Schleife zu handhaben und Listenverständnis für die äußere Schleife zu verwenden. Etwas wie:

f = open(file)
data = [list(line.strip().upper()) for line in f]

Bei einer Zeichenkette als Eingabe erstellt der Listenkonstruktor eine Liste, in der jedes Zeichen der Zeichenkette ein einzelnes Element der Liste ist.

Das Listenverständnis ist funktional äquivalent zu:

data = []
for line in f:
    data.append(list(line.strip().upper()))

2voto

steveha Punkte 70950

Hier ist eine Ebene des Listenverständnisses.

data = []
f = open(file,'r')

for line in f:
    data.append([ch for ch in line.strip().upper()])

Aber wir können das Ganze in einem Rutsch erledigen:

f = open(file, 'rt')
data = [list(line.strip().upper()) for line in f]

Dies ist die Verwendung von list() um eine Zeichenkette in eine Liste von Ein-Zeichen-Zeichenfolgen umzuwandeln. Wir könnten auch verschachtelte Listenauffassungen verwenden und die open() inline:

data = [[ch for ch in line.strip().upper()] for line in open(file, 'rt')]

Zum jetzigen Zeitpunkt denke ich jedoch, dass die Listenauffassungen Beeinträchtigend von der leichten Lesbarkeit des Geschehens.

Für komplizierte Verarbeitungen, wie Listen innerhalb von Listen, sollten Sie eine for Schleife für die äußere Ebene und ein Listenverständnis für die innere Schleife.

Außerdem, wie Chris Lutz in einem Kommentar sagte, gibt es in diesem Fall wirklich keinen Grund, jede Zeile explizit in Zeichenlisten aufzuteilen; Sie können eine Zeichenkette immer als Liste behandeln, und Sie können String-Methoden mit einer Zeichenkette verwenden, aber Sie können keine String-Methoden mit einer Liste verwenden. (Nun, Sie könnten verwenden ''.join() um die Liste wieder zu einer Zeichenkette zusammenzufügen, aber warum sollte man sie nicht einfach als Zeichenkette belassen?)

1voto

interjay Punkte 101333
data = [list(line.strip().upper()) for line in open(file,'r')]

1voto

Robert Rossney Punkte 91100

Der einzige wirklich signifikante Unterschied zwischen Zeichenketten und Listen von Zeichen ist, dass Zeichenketten unveränderlich sind. Sie können über Zeichenketten iterieren und sie in Scheiben schneiden, genauso wie Sie es mit Listen tun würden. Und es ist viel bequemer, Strings als Strings zu behandeln, da sie String-Methoden unterstützen, während Listen dies nicht tun.

Für die meisten Anwendungen würde ich mir also nicht die Mühe machen, die Elemente in data auf eine Liste setzen; ich würde es einfach tun:

data = [line.strip() for line in open(filename, 'r')]

Wenn ich Zeichenketten in data als veränderliche Listen zu verwenden, würde ich list um sie zu konvertieren, und join um sie zurückzustellen, z.B.:

data[2] = ''.join(sorted(list(data[2])))

Wenn Sie diese Zeichenketten nur ändern wollen, können Sie sie natürlich auch als Listen speichern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X