Lesson 7
Listen
1. Listen
Die meisten Programme arbeiten nicht nur mit Variablen. Sie verwenden auch Listen von Variablen. Ein Programm kann z. B. Informationen zu Schülern in einer Klasse verarbeiten, indem es die Liste der Schüler über die Tastatur oder aus einer Datei liest. Eine Änderung der Anzahl der Schüler in der Klasse darf keine Änderung des Programmquellcodes erfordern.
Zuvor hatten wir bereits die Aufgabe, Elemente einer Sequenz zu verarbeiten - zum Beispiel beim Berechnen des größten Elements der Sequenz. Aber wir haben die ganze Sequenz nicht im Computer gespeichert. Bei vielen Problemen ist es jedoch notwendig, die gesamte Sequenz zu behalten, als ob wir alle Elemente einer Sequenz in aufsteigender Reihenfolge ausdrucken müssten ("sortiere eine Sequenz").
Um solche Daten zu speichern, können Sie in Python die Datenstruktur namens list verwenden (in den meisten Programmiersprachen wird der andere Begriff verwendet - "array"). Eine Liste ist eine Folge von Elementen, die von 0 nummeriert sind, genau wie Zeichen in der Zeichenfolge. Die Liste kann manuell durch Aufzählung der Elemente in eckigen Klammern wie hier eingestellt werden:
Primes = [2, 3, 5, 7, 11, 13] Rainbow = ['Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Indigo', 'Violet']
Die Liste Primes
hat 6 Elemente, nämlich: Primes[0] == 2
, Primes[1] == 3
, Primes[2] == 5
, Primes[3] == 7
, Primes[4] == 11
, Primes[5] == 13
. Die Liste Rainbow
hat 7 Elemente, von denen jedes die Zeichenfolge ist.
Wie die Zeichen in der Zeichenfolge können die Listenelemente auch einen negativen Index haben, z. B. Primes[-1] == 13
, Primes[-6] == 2
. Der negative Index bedeutet, dass wir beim letzten Element beginnen und beim Lesen einer Liste nach links gehen.
Sie können die Anzahl der Elemente in einer Liste mit der Funktion len
(dh Länge der Liste ) ermitteln, z. B. len(Primes) == 6
.
Im Gegensatz zu Strings sind die Elemente einer Liste änderbar. Sie können geändert werden, indem Sie ihnen neue Werte zuweisen.
Rainbow = ['Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Indigo', 'Violet'] print(Rainbow[0]) Rainbow[0] = 'red' print('Print the rainbow') for i in range(len(Rainbow)): print(Rainbow[i])
Betrachten Sie mehrere Möglichkeiten zum Erstellen und Lesen von Listen. Zuallererst können Sie eine leere Liste erstellen (die Liste ohne Elemente, deren Länge 0 ist), und Sie können Elemente am Ende Ihrer Liste hinzufügen, indem Sie append
. Angenommen, das Programm empfängt die Anzahl der Elemente in der Liste n
und dann n
Elemente der Liste nacheinander in der separaten Zeile. Hier ist ein Beispiel für Eingabedaten in diesem Format:
5 1809 1854 1860 1891 1925In diesem Fall können Sie das Lesen aus dieser Liste wie folgt organisieren:
a = [] # starte eine leere Liste n = int(input()) # Lese die Nummer des Elements in der Liste for i in range(n): new_element = int(input()) # lies nächstes Element a.append(new_element) # füge es der Liste hinzu # die letzten zwei Zeilen könnten durch eins ersetzt werden: # a.append (int (Eingabe ())) print(a)
Im gezeigten Beispiel wird die leere Liste erstellt, dann wird die Anzahl der Elemente gelesen, dann werden die Listenelemente Zeile für Zeile gelesen und an das Ende angehängt. Das Gleiche kann getan werden, indem die Variable n
:
a = [] for i in range(int(input())): a.append(int(input())) print(a)
Es gibt mehrere Operationen, die für Listen definiert sind: Listenverkettung (Hinzufügen von Listen, dh "Verkleben" einer Liste mit einer anderen) und Wiederholen (Multiplizieren einer Liste mit einer Zahl). Beispielsweise:
a = [1, 2, 3] b = [4, 5] c = a + b d = b * 3 print([7, 8] + [9]) print([0, 1] * 3)
Die resultierende Liste c
wird gleich [1, 2, 3, 4, 5]
und eine Liste von d
wird gleich [4, 5, 4, 5, 4, 5]
. Dadurch können Sie den Prozess des Lesens von Listen anders organisieren: Betrachten Sie zuerst die Größe der Liste und erstellen Sie eine Liste aus der gewünschten Anzahl von Elementen, dann durchlaufen Sie die Variable i
beginnend mit der Nummer 0 und innerhalb der Schleife lesen Sie das i
te Element der Liste:
a = [0] * int(input()) for i in range(len(a)): a[i] = int(input())
Sie können Elemente einer Liste a
mit print(a)
. Dadurch werden die Listenelemente in eckigen Klammern angezeigt und durch Kommata getrennt. Im Allgemeinen ist dies unbequem; gemeinsam drucken Sie alle Elemente in einer Zeile oder einem Element pro Zeile. Hier sind zwei Beispiele, die andere Formen von Schleifen verwenden:
a = [1, 2, 3, 4, 5] for i in range(len(a)): print(a[i])
Hier wird der Index i
geändert, dann wird das Element a[i]
angezeigt.
a = [1, 2, 3, 4, 5] for elem in a: print(elem, end=' ')
In diesem Beispiel werden die Listenelemente in einer durch Leerzeichen getrennten Zeile angezeigt, und nicht der Index wird geändert, sondern der Wert der Variablen selbst (z. B. in der Schleife for elem in ['red', 'green', 'blue']
Variable elem
nimmt elem
die Werte 'red'
, 'green'
, 'blue'
.
Achten Sie besonders auf das letzte Beispiel! Ein sehr wichtiger Teil der Python-Ideologie ist die for
Schleife, die die bequeme Möglichkeit bietet, über alle Elemente einer Sequenz zu iterieren. Hier unterscheidet sich Python von Pascal, wo Sie über die Indizes der Elemente, nicht aber über die Elemente selbst iterieren müssen.
Sequenzen in Python sind Strings, Listen, Werte des Funktionsbereichs range()
(dies sind keine Listen) und einige andere Objekte.
Hier ist ein Beispiel, das die Verwendung der for
Schleife zeigt, wenn Sie alle Ziffern aus einer Zeichenkette extrahieren und eine numerische Liste von ihnen erstellen müssen.
# gegeben: s = 'ab12c59p7dq' # Sie müssen Zahlen aus der Liste s extrahieren # um es so zu machen: # Ziffern == [1, 2, 5, 9, 7] s = 'ab12c59p7dq' digits = [] for symbol in s: if '1234567890'.find(symbol) != -1: digits.append(int(symbol)) print(digits)
2. Teilen und verbinden Methoden
Listenelemente können in einer Zeile getrennt durch ein Zeichen angegeben werden. In diesem Fall kann die gesamte Liste mit input()
gelesen werden. Sie können dann eine Zeichenfolgemethode split()
, die eine Liste von Zeichenfolgen zurückgibt, die sich nach dem Ausschneiden der ursprünglichen Zeichenfolge durch Leerzeichen ergeben. Beispiel:
# Die Eingabe ist eine Zeichenfolge # 1 2 3 s = input() # s == '1 2 3' a = s.split() # a == ['1', '2', '3'] print(a)
Wenn Sie dieses Programm mit den Eingabedaten von 1 2 3
ausführen, wird die Liste a
gleich ['1', '2', '3']
. Bitte beachten Sie, dass die Liste aus Strings besteht, nicht aus Zahlen. Wenn Sie die Liste der Zahlen erhalten möchten, müssen Sie die Listenelemente nacheinander in Ganzzahlen umwandeln:
a = input().split() for i in range(len(a)): a[i] = int(a[i]) print(a)
Mit der speziellen Magie von Python - Generatoren - kann das gleiche in einer Zeile gemacht werden:
a = [int(s) for s in input().split()] print(a)
(Wir erklären, wie dieser Code im nächsten Abschnitt funktioniert.) Wenn Sie eine Liste reeller Zahlen lesen möchten, müssen Sie den Typ int
in float
ändern.
Die Methode split()
hat einen optionalen Parameter, der bestimmt, welche Zeichenfolge als Trennzeichen zwischen Listenelementen verwendet wird. Wenn Sie beispielsweise die Methode split('.')
Aufrufen, wird die Liste zurückgegeben, die durch Aufteilen der ursprünglichen Zeichenfolge mit dem Zeichen '.'
ist aufgetreten:
a = '192.168.0.1'.split('.') print(a)
In Python können Sie eine Liste von Strings mit einzeiligen Befehlen anzeigen. Dafür wird der Methoden- join
verwendet; Diese Methode hat einen Parameter: eine Liste von Strings. Sie gibt die Zeichenfolge zurück, die durch Verkettung der angegebenen Elemente erhalten wurde, und das Trennzeichen wird zwischen die Elemente der Liste eingefügt. Dieses Trennzeichen entspricht der Zeichenfolge, auf die die Methode angewendet wird. Wir wissen, dass Sie den ersten Satz vom ersten Mal an nicht verstanden haben. :) Schau dir die Beispiele an:
a = ['red', 'green', 'blue'] print(' '.join(a)) # zurück rot grün blau print(''.join(a)) # zurück rotgrünblau print('***'.join(a)) # gibt Rot *** Grün *** Blau zurück
Wenn eine Liste aus Zahlen besteht, müssen Sie die dunkle Magie von Generatoren verwenden. So können Sie die Elemente einer Liste, getrennt durch Leerzeichen, ausdrucken:
a = [1, 2, 3] print(' '.join([str(i) for i in a])) # die nächste Zeile verursacht einen Typfehler, # as join () kann nur Str. verketten # drucken ('' .join (a))
Wenn Sie jedoch kein Fan von dunkler Magie sind, können Sie den gleichen Effekt erzielen, indem Sie die Schleife for
.
3. Generatoren
Um eine Liste mit identischen Elementen zu erstellen, können Sie die Liste der Wiederholungen verwenden, zum Beispiel:
n = 5 a = [0] * n print(a)
Um kompliziertere Listen zu erstellen, können Sie Generatoren verwenden : die Ausdrücke, die es erlauben, eine Liste nach einer Formel zu füllen. Die generelle Form eines Generators ist wie folgt:
[expression for variable in sequence]
wobei variable
die ID einer Variablen ist, sequence
ist eine Folge von Werten, die die Variable nimmt (Dies ist eine Liste sein kann, eine Zeichenfolge oder ein Objekt erhalten wird mit der Funktion range
), expression
- einige Ausdruck, in der Regel auf die Variable in Abhängigkeit im Generator verwendet. Die Listenelemente werden gemäß diesem Ausdruck gefüllt.
Hier sind einige Beispiele von Leuten, die Generatoren benutzen.
So erstellen Sie eine Liste von n
Nullen mit dem Generator:
a = [0 for i in range(5)] print(a)
So erstellen Sie eine Liste mit Quadraten mit ganzen Zahlen:
n = 5 a = [i ** 2 for i in range(n)] print(a)
Wenn Sie eine Liste von Zahlenquadraten von 1 bis n
ausfüllen müssen, können Sie die Einstellungen für den range
in den range(1, n + 1)
ändern:
n = 5 a = [i ** 2 for i in range(1, n + 1)] print(a)
Hier ist, wie Sie eine Liste mit Zufallszahlen von 1 bis 9 (mit randrange
aus dem Modul random
) erhalten können:
from random import randrange n = 10 a = [randrange(1, 10) for i in range(n)] print(a)
Und in diesem Beispiel wird die Liste aus Zeilen lesen von der Standardeingabe: Erstens, müssen Sie die Anzahl der Elemente der Liste (dieser Wert verwendet wird als Argument der Funktion eingeben range
), die zweite - die Zahl der Saiten:
a = [input() for i in range(int(input()))] print(a)
4. Scheiben
Mit Listen und Strings können Sie Slices erstellen. Nämlich:
A[i:j]
slice ji
Elemente A[i]
, A[i+1]
, ..., A[j-1]
.
A[i:j:-1]
Scheibe ij
Elemente A[i]
, A[i-1]
, ..., A[j+1]
(dh die Reihenfolge der Elemente ändern).
A[i:j:k]
mit dem Schritt k
geschnitten: A[i]
, A[i+k]
, A[i+2*k]
, .... Wenn der Wert von k
<0 ist, kommen die Elemente in umgekehrter Reihenfolge.
Jede der Zahlen i
oder j
kann fehlen, was "der Anfang der Zeile" oder "das Ende der Zeile" bedeutet
Listen sind im Gegensatz zu Zeichenfolgen veränderbare Objekte : Sie können einem neuen Wert ein Listenelement zuweisen. Darüber hinaus ist es möglich ganze Scheiben zu wechseln. Beispielsweise:
A = [1, 2, 3, 4, 5] A[2:4] = [7, 8, 9] print(A)
Hier erhielten wir eine Liste [1, 2, 3, 4, 5]
und versuchen dann, die zwei Elemente des Slices A[2:4]
durch eine neue Liste von drei Elementen zu ersetzen. Die resultierende Liste ist wie folgt: [1, 2, 7, 8, 9, 5]
.
A = [1, 2, 3, 4, 5, 6, 7] A[::-2] = [10, 20, 30, 40] print(A)
Und hier wird die resultierende Liste [40, 2, 30, 4, 20, 6, 10]
. Der Grund ist, dass A[::-2]
eine Liste der Elemente A[-1]
, A[-3]
, A[-5]
, A[-7]
ist und dass diese Elemente 10, 20, 30, 40 jeweils.
Wenn einem diskontinuierlichen Schnitt (dh einem Schnitt mit einem Schritt k
, k > 1
) ein neuer Wert zugewiesen wird, stimmt die Anzahl der Elemente in dem alten und dem neuen ValueError
notwendigerweise überein, andernfalls tritt der Fehler ValueError
auf.
Beachten Sie, dass A[i]
ein Listenelement ist, kein Schnitt!
5. Operationen auf Listen
Sie können viele verschiedene Operationen mit Listen ausführen.
x in A | Überprüfen Sie, ob ein Element in der Liste enthalten ist. Gibt True oder False zurück |
x nicht in A | Das gleiche wie nicht (x in A) |
min (A) | Das kleinste Element der Liste |
max (A) | Das größte Element in der Liste |
A.index (x) | Der Index des ersten Auftretens von Element x in der Liste; in seiner Abwesenheit erzeugt eine Ausnahme ValueError |
A.Zahl (x) | Die Anzahl der Vorkommen von Element x in der Liste |