Eine geordnete Sammlung, die sich ändern lässt
Eine Liste hält Werte in Reihenfolge in eckigen Klammern: [184.0, 185.5, 183.2]. Sie kann beliebige Werte enthalten, und len(prices) sagt, wie viele. Jedes Element hat eine Position, den Index, gezählt ab 0. Ein negativer Index zählt vom Ende, -1 ist also das letzte Element. Eine nicht vorhandene Position löst einen IndexError aus.
prices = [184.0, 185.5, 183.2, 186.1]
# Reading by position
print(prices[0]) # 184.0
print(prices[-1]) # 186.1
print(len(prices)) # 4
# A list is changeable: assign to a position
prices[1] = 185.0
print(prices) # [184.0, 185.0, 183.2, 186.1]Slicing: ein Teil einer Liste
prices[start:stop] liefert eine neue Liste von start bis ausschließlich stop. Lassen Sie eine Grenze weg, reicht die Teilliste bis zu diesem Ende: prices[:3] sind die ersten drei, prices[-3:] die letzten drei. Ein Slice löst nie einen Fehler aus, wenn er zu weit geht, er endet einfach am Ende. Eine Falle: -0 ist gleich 0, also ist prices[-0:] die ganze Liste, nicht eine leere.
prices = [184.0, 185.0, 183.2, 186.1, 187.4]
# Slices are new lists
print(prices[1:3]) # [185.0, 183.2]
print(prices[:2]) # [184.0, 185.0]
print(prices[-2:]) # [186.1, 187.4]
# Going past the end is fine, but -0 is not "none"
print(prices[3:99]) # [186.1, 187.4]
print(prices[-0:]) # the whole listHinzufügen und Entfernen
append(x) hängt ein Element hinten an, extend(items) mehrere, und insert(i, x) setzt eines an Position i. pop() entfernt und liefert das letzte Element (pop(i) das an i), remove(x) löscht das erste Element, das x entspricht. Diese Methoden ändern die Liste an Ort und Stelle und liefern None; prices = prices.append(1) macht prices also zu None. Das Addieren mit + erzeugt dagegen eine neue Liste.
# Changing a list in place
fills = [100, 250]
fills.append(75)
fills.extend([40, 60])
print(fills) # [100, 250, 75, 40, 60]
last = fills.pop()
fills.remove(250)
print(last, fills) # 60 [100, 75, 40]
# + builds a new list and leaves the old ones alone
both = fills + [10]
print(both, fills) # [100, 75, 40, 10] [100, 75, 40]Sortieren
Es gibt zwei Wege zu sortieren. prices.sort() ordnet die Liste an Ort und Stelle neu und liefert None. sorted(prices) lässt das Original unberührt und liefert eine neue sortierte Liste; es akzeptiert auch jedes Iterable. Beide kennen reverse=True für „größte zuerst“ und key=..., um nach etwas anderem zu sortieren, etwa key=len. Bevorzugen Sie sorted, wenn anderer Code die ursprüngliche Reihenfolge noch braucht.
# sorted() returns a new list, sort() changes the old one
prices = [185.0, 183.2, 187.4, 184.0]
ranked = sorted(prices, reverse=True)
print(ranked) # [187.4, 185.0, 184.0, 183.2]
print(prices) # [185.0, 183.2, 187.4, 184.0] (unchanged)
prices.sort()
print(prices) # [183.2, 184.0, 185.0, 187.4]Zwei Namen, eine Liste
backup = prices kopiert die Liste nicht: Beide Namen zeigen auf dasselbe Objekt, eine Änderung an einem wirkt also auf das andere. Eine echte (flache) Kopie erzeugen Sie mit prices.copy(), list(prices) oder dem Slice prices[:]. Dasselbe gilt für Funktionen: Ruft eine Funktion .append, .sort oder .pop auf ihrem Argument auf, ändert sie auch die Liste des Aufrufers, womit dieser selten rechnet.
# A second name is not a copy
prices = [184.0, 185.0]
alias = prices
alias.append(186.0)
print(prices) # [184.0, 185.0, 186.0]
# A real copy is independent
backup = list(prices)
backup.append(187.0)
print(prices) # [184.0, 185.0, 186.0]
print(backup) # [184.0, 185.0, 186.0, 187.0]sorted(...), Slices und Comprehensions, die alle neue Listen bauen. Die Labs prüfen, dass die übergebene Liste danach unverändert ist.items[i],items[-1]: ein Element;items[a:b]: eine neue Liste.append,extend,insert,pop,removeändern die Liste und liefern nichts Brauchbares.sorted(items)baut eine neue sortierte Liste;items.sort()ordnet an Ort und Stelle um.
Als Nächstes: Tupel und Entpacken, das Geschwister der Liste mit fester Größe und ein sauberer Weg, Werte auseinanderzunehmen.
Lab: Was bewertet wird
- Mit
top_ndie höchsten Preise auswählen25 Pkt. - Mit
last_ndie neuesten Werte nehmen25 Pkt. - Mit
moving_averagejedes Preisfenster mitteln25 Pkt. - Mit
rotateWerte von einem Ende zum anderen verschieben25 Pkt.