Grundlegendes zum Listenverständnis in Python 3

Einführung

List comprehensions bieten eine prägnante Möglichkeit,lists basierend auf vorhandenen Listen zu erstellen. Bei Verwendung des Listenverständnisses können Listen erstellt werden, indemiterable, einschließlichstrings undtuples, genutzt werden.

Syntaktisch besteht Listenverständnis aus einer Iterable, die einen Ausdruck gefolgt von einerfor-Klausel enthält. Darauf können zusätzlichefor- oderif-Klauseln folgen. Wenn Sie also mitfor loops undconditional statements vertraut sind, können Sie das Listenverständnis besser verstehen.

Listenverständnisse bieten eine alternative Syntax zum Erstellen von Listen und anderen sequentiellendata types. Während andere Iterationsmethoden, wie z. B.for-Schleifen, ebenfalls zum Erstellen von Listen verwendet werden können, wird das Listenverständnis möglicherweise bevorzugt, da sie die Anzahl der in Ihrem Programm verwendeten Zeilen begrenzen können.

Listenverständnisse

In Python sind Listenverständnisse folgendermaßen aufgebaut:

list_variable = [x for x in iterable]

Eine Liste oder ein anderes iterierbares Element wird einer Variablen zugewiesen. Zusätzliche Variablen, die für Elemente innerhalb der Iterable stehen, werden um einefor-Klausel herum konstruiert. Das Schlüsselwortin wird wie infor-Schleifen verwendet, um überiterable zu iterieren.

Schauen wir uns ein Beispiel an, in dem eine Liste basierend auf einer Zeichenfolge erstellt wird:

shark_letters = [letter for letter in 'shark']
print(shark_letters)

Hier wird die neue Liste der Variablenshark_letters zugewiesen, undletter wird verwendet, um für die Elemente zu stehen, die in der iterierbaren Zeichenfolge'shark' enthalten sind.

Damit wir bestätigen können, wie die neue Listeshark_letters aussieht, rufen wir sie beiprint() auf und erhalten die folgende Ausgabe:

Output['s', 'h', 'a', 'r', 'k']

Die Liste, die wir mit dem Listenverständnis erstellt haben, besteht aus den Elementen in der Zeichenfolge'shark', dh einer Zeichenfolge für jeden Buchstaben.

Listenverständnisse können alsfor-Schleifen umgeschrieben werden, obwohl nicht jedefor-Schleife als Listenverständnis umgeschrieben werden kann.

Verwenden Sie unser Listenverständnis, mit dem die Listeshark_lettersoben erstellt wurde, und schreiben Sie sie alsfor-Schleife neu. Dies kann uns helfen, die Funktionsweise des Listenverständnisses besser zu verstehen.

shark_letters = []

for letter in 'shark':
    shark_letters.append(letter)

print(shark_letters)

Beim Erstellen einer Liste mit einerfor-Schleife muss die der Liste zugewiesene Variable wie in der ersten Zeile unseres Codeblocks mit einer leeren Liste initialisiert werden. Diefor-Schleife durchläuft dann das Element unter Verwendung der Variablenletter in der iterierbaren Zeichenfolge'shark'. Innerhalb derfor-Schleife ist jedes Element in der Zeichenfolgeadded to the list with the list.append(x) method.

Das Umschreiben des Listenverständnisses alsfor-Schleife liefert die gleiche Ausgabe:

Output['s', 'h', 'a', 'r', 'k']

Listenverständnisse können alsfor-Schleifen umgeschrieben werden, und einigefor-Schleifen können als Listenverständnisse umgeschrieben werden, um den Code prägnanter zu gestalten.

Verwenden von Bedingungen mit Listenverständnissen

Für das Listenverständnis können Bedingungsanweisungen verwendet werden, um vorhandene Listen oder andere sequenzielle Datentypen beim Erstellen neuer Listen zu ändern.

Schauen wir uns ein Beispiel für eineif-Anweisung an, die in einem Listenverständnis verwendet wird:

fish_tuple = ('blowfish', 'clownfish', 'catfish', 'octopus')

fish_list = [fish for fish in fish_tuple if fish != 'octopus']
print(fish_list)

Das Listenverständnis verwendet das Tupelfish_tuple als Grundlage für die neue Liste mit dem Namenfish_list. Die Schlüsselwörterfor undin werden wie insection above verwendet, und jetzt wird eine Anweisungif hinzugefügt. Die Anweisungif besagt, dass nur die Elemente hinzugefügt werden sollen, die nicht der Zeichenfolge'octopus' entsprechen. In der neuen Liste werden daher nur Elemente aus dem Tupel berücksichtigt, die nicht mit'octopus' übereinstimmen.

Wenn wir dies ausführen, werden wir sehen, dassfish_list die gleichen Zeichenfolgenelemente wiefish_tuple enthält, außer dass die Zeichenfolge'octopus' weggelassen wurde:

Output['blowfish', 'clownfish', 'catfish']

Unsere neue Liste enthält daher alle Elemente des ursprünglichen Tupels mit Ausnahme der Zeichenfolge, die von der bedingten Anweisung ausgeschlossen wird.

Wir werden ein weiteres Beispiel erstellen, dasmathematical operators,integers undrange() sequence type verwendet.

number_list = [x ** 2 for x in range(10) if x % 2 == 0]
print(number_list)

Die Liste, die erstellt wird,number_list, wird mit den quadratischen Werten jedes Elements im Bereich von 0 bis 9if gefüllt. Der Wert des Elements ist durch 2 teilbar. Die Ausgabe ist wie folgt:

Output[0, 4, 16, 36, 64]

Überlegen wir uns, was ausgedruckt werden würde, wenn wir nurx for x in range(10) aufrufen würden, um herauszufinden, was das Listenverständnis ein wenig mehr bewirkt. Unser kleines Programm und unsere Ausgabe würden dann so aussehen:

number_list = [x for x in range(10)]
print(number_list)
Output[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Fügen wir nun die bedingte Anweisung hinzu:

number_list = [x for x in range(10) if x % 2 == 0]
print(number_list)
Output[0, 2, 4, 6, 8]

Die Anweisungifhat die Elemente in der endgültigen Liste so begrenzt, dass sie nur die Elemente enthalten, die durch 2 teilbar sind, wobei alle ungeraden Zahlen weggelassen werden.

Schließlich können wir den Operator so hinzufügen, dass jedesx im Quadrat ist:

number_list = [x ** 2 for x in range(10) if x % 2 == 0]
print(number_list)

Jede der Zahlen in der vorherigen Liste von[0, 2, 4, 6, 8] ist jetzt quadriert:

Output[0, 4, 16, 36, 64]

Sie könnennested if statements auch mit einem Listenverständnis replizieren:

number_list = [x for x in range(100) if x % 3 == 0 if x % 5 == 0]
print(number_list)

Hier prüft das Listenverständnis zunächst, ob die Zahlx durch 3 teilbar ist, und prüft dann, obx durch 5 teilbar ist. Wennx beide Anforderungen erfüllt, wird es gedruckt und die Ausgabe lautet:

Output[0, 15, 30, 45, 60, 75, 90]

Mit den Anweisungen von Conditionalifkönnen Sie steuern, welche Elemente aus einer vorhandenen Sequenz in die Erstellung einer neuen Liste einbezogen werden.

Verschachtelte Schleifen in einer Listenübersicht

Nested loops kann verwendet werden, um mehrere Iterationen in unseren Programmen durchzuführen.

Dieses Mal werden wir uns eine vorhandene verschachteltefor-Schleifenkonstruktion ansehen und uns auf ein Listenverständnis hinarbeiten.

Unser Code erstellt eine neue Liste, die über 2 Listen iteriert und darauf aufbauend mathematische Operationen ausführt. Hier ist unser verschachtelter Schleifencodeblockfor:

my_list = []

for x in [20, 40, 60]:
    for y in [2, 4, 6]:
        my_list.append(x * y)

print(my_list)

Wenn wir diesen Code ausführen, erhalten wir die folgende Ausgabe:

Output[40, 80, 120, 80, 160, 240, 120, 240, 360]

Dieser Code multipliziert die Elemente in der ersten Liste mit den Elementen in der zweiten Liste über jede Iteration.

Um dies in ein Listenverständnis umzuwandeln, werden wir jede Codezeile in einer Zeile zusammenfassen, beginnend mit der Operationx * y. Darauf folgt die äußerefor-Schleife und dann die innerefor-Schleife. Wir werden eineprint()-Anweisung unter unser Listenverständnis einfügen, um zu bestätigen, dass die neue Liste mit der Liste übereinstimmt, die wir mit unserem verschachteltenfor-Schleifenblock oben erstellt haben:

my_list = [x * y for x in [20, 40, 60] for y in [2, 4, 6]]
print(my_list)
Output[40, 80, 120, 80, 160, 240, 120, 240, 360]

Unser Listenverständnis nimmt die verschachteltenfor-Schleifen und glättet sie in eine Codezeile, während immer noch genau dieselbe Liste erstellt wird, die dermy_list-Variablen zugewiesen wird.

Mit Listenverständnissen können wir auf prägnante Weise Listen erstellen und so mehrere Codezeilen zu einer einzigen Zeile zusammenfassen. Beachten Sie jedoch, dass die Lesbarkeit unseres Codes immer Vorrang haben sollte. Wenn eine Liste zu lang oder unhandlich wird, empfiehlt es sich, sie in Schleifen aufzuteilen.

Fazit

Mit Listenverständnissen können wir eine Liste oder eine andere Sequenz in eine neue Liste umwandeln. Sie bieten eine kurze Syntax, um diese Aufgabe zu erledigen und unsere Codezeilen einzuschränken.

Listenverständnisse folgen der mathematischen Form der Mengenerstellungsnotation oder des Mengenverständnisses, sodass sie für Programmierer mit mathematischem Hintergrund besonders intuitiv sein können.

Obwohl Listenverständnis unseren Code prägnanter machen kann, ist es wichtig, sicherzustellen, dass unser endgültiger Code so gut wie möglich lesbar ist. Daher sollten sehr lange einzelne Codezeilen vermieden werden, um die Benutzerfreundlichkeit unseres Codes zu gewährleisten.