Eine Sammlung ohne Wiederholungen
Eine Menge (set) enthält jeden Wert höchstens einmal und hat keine Position: {"AAPL", "MSFT", "GOOG"}. Einen schon vorhandenen Wert hinzuzufügen ändert nichts. set(items) macht aus jedem Iterable eine Menge, der schnellste Weg, Duplikate zu entfernen, und len zählt dann die verschiedenen Werte. Da eine Menge keine Ordnung hat, lässt sie sich nicht indizieren, und auf die beim Ausgeben sichtbare Reihenfolge darf man sich nicht verlassen. Die leere Menge ist set(): {} ist ein leeres Dictionary.
symbols = ["AAPL", "MSFT", "AAPL", "GOOG", "MSFT"]
# set() removes repeats
unique = set(symbols)
print(len(symbols), len(unique)) # 5 3
# Adding something already there changes nothing
unique.add("AAPL")
unique.add("TSLA")
print(len(unique)) # 4
# {} is a dict; an empty set is set()
print(type({}), type(set())) # <class 'dict'> <class 'set'>Schnelle Zugehörigkeitstests
x in some_set antwortet fast sofort, selbst bei Millionen von Werten, weil eine Menge einen Wert über seinen Hash findet, statt alles abzusuchen. Derselbe Test auf einer Liste prüft die Elemente nacheinander und wird langsamer, je größer die Liste wird. Fragen Sie also oft mit in dieselbe Sammlung ab, etwa jede eingehende Order gegen eine Liste gesperrter Symbole, wandeln Sie sie einmal in eine Menge um. Mitglieder einer Menge müssen hashbar sein, wie Dictionary-Schlüssel.
# Membership: a set is the fast structure for "is it in there?"
banned = {"GME", "AMC", "BBBY"}
orders = ["AAPL", "GME", "MSFT", "AMC"]
allowed = [symbol for symbol in orders if symbol not in banned]
print(allowed) # ['AAPL', 'MSFT']
# Sets only keep hashable values
try:
{["AAPL"]}
except TypeError as error:
print("not hashable:", error)Mengenarithmetik
Mengen lassen sich wie in der Schulmathematik verknüpfen. a | b ist die Vereinigung (in einer von beiden), a & b der Durchschnitt (in beiden), a - b die Differenz (in a, aber nicht in b) und a ^ b die symmetrische Differenz (in genau einer). Jede gibt es auch als Methode, etwa a.union(b), die jedes Iterable akzeptiert. Alle liefern eine neue Menge und lassen a und b unverändert. Genau das braucht man, um zwei Symboluniversen oder zwei Bestandslisten zu vergleichen.
# Comparing yesterday's and today's universe
yesterday = {"AAPL", "MSFT", "GOOG", "IBM"}
today = {"AAPL", "MSFT", "TSLA"}
print(sorted(yesterday | today)) # ['AAPL', 'GOOG', 'IBM', 'MSFT', 'TSLA']
print(sorted(yesterday & today)) # ['AAPL', 'MSFT']
print(sorted(today - yesterday)) # ['TSLA'] (new listings)
print(sorted(yesterday - today)) # ['GOOG', 'IBM'] (dropped)
print(sorted(yesterday ^ today)) # ['GOOG', 'IBM', 'TSLA']Eine Menge ändern und die Reihenfolge behalten
add(x) fügt einen Wert ein, update(items) mehrere, discard(x) entfernt einen Wert, falls vorhanden (stillschweigend), und remove(x) entfernt ihn, löst aber KeyError aus, wenn er fehlt. Eine Menge vergisst die Reihenfolge; kommt es auf sie an, braucht man eine Liste: sorted(some_set) liefert eine sortierte Liste, und um Duplikate unter Beibehaltung der Reihenfolge des ersten Auftretens zu entfernen, durchlaufen Sie die Werte und merken sich in einer Menge, was Sie schon gesehen haben (seen). Die Prüfung ist schnell, weil es eine Menge ist.
# Remove repeats and keep the first-seen order
symbols = ["MSFT", "AAPL", "MSFT", "GOOG", "AAPL"]
seen = set()
ordered = []
for symbol in symbols:
if symbol not in seen:
seen.add(symbol)
ordered.append(symbol)
print(ordered) # ['MSFT', 'AAPL', 'GOOG']
# discard is quiet, remove is strict
seen.discard("TSLA")
try:
seen.remove("TSLA")
except KeyError:
print("TSLA was not in the set")sorted(...), um eine stabile Liste zu erhalten. Die Labs verlangen genau deshalb sortierte Listen.set(items): jeden Wert einmal behalten;len(set(items))zählt die verschiedenen Werte.x in sist schnell;a | b,a & b,a - b,a ^ bbauen neue Mengen.- Mengen haben keine Ordnung: Nehmen Sie
sorted(s), wenn Sie eine Liste brauchen.
Als Nächstes: Textdateien lesen und schreiben, damit Ihre Programme Daten zwischen Läufen behalten.
Lab: Was bewertet wird
- Mit
distinct_countverschiedene Symbole zählen25 Pkt. - Mit
new_listingsneu erschienene Symbole erkennen25 Pkt. - Mit
common_symbolsdie Schnittmenge zweier Portfolios finden25 Pkt. - Mit
dedupe_keep_orderWiederholungen entfernen und die Reihenfolge behalten25 Pkt.