Einführung
In diesem Abschnitt werden Listen, Wörterbücher und Mengen behandelt.
This tutorial is from open-source community. Access the source code
💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken
In diesem Abschnitt werden Listen, Wörterbücher und Mengen behandelt.
Programme müssen oft mit vielen Objekten arbeiten.
Es gibt drei Hauptauswahlmöglichkeiten.
Verwenden Sie eine Liste, wenn die Reihenfolge der Daten wichtig ist. Denken Sie daran, dass Listen beliebige Objekte enthalten können. Beispielsweise eine Liste von Tupeln.
portfolio = [
('GOOG', 100, 490.1),
('IBM', 50, 91.3),
('CAT', 150, 83.44)
]
portfolio[0] ## ('GOOG', 100, 490.1)
portfolio[2] ## ('CAT', 150, 83.44)
Listen von Grund auf erstellen.
records = [] ## Initiale leere Liste
## Verwenden Sie.append(), um weitere Elemente hinzuzufügen
records.append(('GOOG', 100, 490.10))
records.append(('IBM', 50, 91.3))
...
Ein Beispiel, wenn Sie Datensätze aus einer Datei lesen.
records = [] ## Initiale leere Liste
with open('portfolio.csv', 'rt') as f:
next(f) ## Überspringen Sie die Kopfzeile
for line in f:
row = line.split(',')
records.append((row[0], int(row[1]), float(row[2])))
Wörterbücher sind nützlich, wenn Sie schnelle Zufallsabfragen (nach Schlüsselnamen) durchführen möchten. Beispielsweise ein Wörterbuch mit Aktienkursen:
prices = {
'GOOG': 513.25,
'CAT': 87.22,
'IBM': 93.37,
'MSFT': 44.12
}
Hier sind einige einfache Abfragen:
>>> prices['IBM']
93.37
>>> prices['GOOG']
513.25
>>>
Beispiel für das Erstellen eines Wörterbuchs von Grund auf.
prices = {} ## Initiales leeres Wörterbuch
## Fügen Sie neue Elemente hinzu
prices['GOOG'] = 513.25
prices['CAT'] = 87.22
prices['IBM'] = 93.37
Ein Beispiel für das Befüllen des Wörterbuchs aus den Inhalten einer Datei.
prices = {} ## Initiales leeres Wörterbuch
with open('prices.csv', 'rt') as f:
for line in f:
row = line.split(',')
prices[row[0]] = float(row[1])
Hinweis: Wenn Sie das auf die prices.csv
-Datei ausprobieren, werden Sie feststellen, dass es fast funktioniert - am Ende gibt es eine leere Zeile, die dazu führt, dass das Programm abstürzt. Sie müssen eine Möglichkeit finden, den Code zu modifizieren, um dies zu berücksichtigen (siehe Übung 2.6).
Sie können die Existenz eines Schlüssels testen.
if key in d:
## JA
else:
## NEIN
Sie können einen Wert abfragen, der möglicherweise nicht existiert, und einen Standardwert angeben, falls dies der Fall ist.
name = d.get(key, default)
Ein Beispiel:
>>> prices.get('IBM', 0.0)
93.37
>>> prices.get('SCOX', 0.0)
0.0
>>>
Fast jeder Wertetyp kann in Python als Wörterbuchschlüssel verwendet werden. Ein Wörterbuchschlüssel muss einen unveränderlichen Typ haben. Beispielsweise Tupel:
holidays = {
(1, 1) : 'Neujahr',
(3, 14) : 'Pi Tag',
(9, 13) : "Programmierer-Tag",
}
Dann um darauf zuzugreifen:
>>> holidays[3, 14]
'Pi Tag'
>>>
Weder eine Liste, ein Set noch ein weiteres Wörterbuch kann als Wörterbuchschlüssel dienen, da Listen und Wörterbücher veränderlich sind.
Mengen sind Sammlungen ungeordneter, eindeutiger Elemente.
tech_stocks = { 'IBM','AAPL','MSFT' }
## Alternative Syntax
tech_stocks = set(['IBM', 'AAPL', 'MSFT'])
Mengen sind nützlich für die Prüfung auf Mitgliedschaft.
>>> tech_stocks
set(['AAPL', 'IBM', 'MSFT'])
>>> 'IBM' in tech_stocks
True
>>> 'FB' in tech_stocks
False
>>>
Mengen sind auch nützlich für die Entfernung von Duplikaten.
names = ['IBM', 'AAPL', 'GOOG', 'IBM', 'GOOG', 'YHOO']
unique = set(names)
## unique = set(['IBM', 'AAPL','GOOG','YHOO'])
Zusätzliche Mengenoperationen:
unique.add('CAT') ## Fügt ein Element hinzu
unique.remove('YHOO') ## Entfernt ein Element
s1 = { 'a', 'b', 'c'}
s2 = { 'c', 'd' }
s1 | s2 ## Mengenunion { 'a', 'b', 'c', 'd' }
s1 & s2 ## Mengenkreuzung { 'c' }
s1 - s2 ## Mengendifferenz { 'a', 'b' }
In diesen Übungen beginnen Sie mit der Erstellung eines der wichtigsten Programme, das für den Rest dieses Kurses verwendet wird. Arbeiten Sie in der Datei report.py
.
Die Datei portfolio.csv
enthält eine Liste von Aktien in einem Portfolio. In Übung 1.30 haben Sie eine Funktion portfolio_cost(filename)
geschrieben, die diese Datei ausliest und eine einfache Berechnung durchführt.
Ihr Code hätte ungefähr so aussehen müssen:
## pcost.py
import csv
def portfolio_cost(filename):
'''Berechnet die Gesamtkosten (Anteile * Preis) einer Portfolio-Datei'''
total_cost = 0.0
with open(filename, 'rt') as f:
rows = csv.reader(f)
headers = next(rows)
for row in rows:
nshares = int(row[1])
price = float(row[2])
total_cost += nshares * price
return total_cost
Nutzen Sie diesen Code als groben Leitfaden und erstellen Sie eine neue Datei report.py
. In dieser Datei definieren Sie eine Funktion read_portfolio(filename)
, die eine gegebene Portfolio-Datei öffnet und sie in eine Liste von Tupeln einliest. Dazu werden Sie den obigen Code leicht modifizieren.
Zunächst werden Sie statt total_cost = 0
eine Variable definieren, die zunächst als leere Liste initialisiert wird. Beispielsweise:
portfolio = []
Als nächstes werden Sie statt die Kosten zu summieren jede Zeile in ein Tupel umwandeln, genauso wie Sie es im letzten Übungsaufgabe getan haben, und es dieser Liste hinzufügen. Beispielsweise:
for row in rows:
holding = (row[0], int(row[1]), float(row[2]))
portfolio.append(holding)
Schließlich werden Sie die resultierende portfolio
-Liste zurückgeben.
Experimentieren Sie interaktiv mit Ihrer Funktion (ein kleiner Hinweis: Um dies zu tun, müssen Sie zunächst das report.py
-Programm im Interpreter ausführen):
Hinweis: Verwenden Sie -i
, wenn Sie die Datei im Terminal ausführen
>>> portfolio = read_portfolio('/home/labex/project/portfolio.csv')
>>> portfolio
[('AA', 100, 32.2), ('IBM', 50, 91.1), ('CAT', 150, 83.44), ('MSFT', 200, 51.23),
('GE', 95, 40.37), ('MSFT', 50, 65.1), ('IBM', 100, 70.44)]
>>>
>>> portfolio[0]
('AA', 100, 32.2)
>>> portfolio[1]
('IBM', 50, 91.1)
>>> portfolio[1][1]
50
>>> total = 0.0
>>> for s in portfolio:
total += s[1] * s[2]
>>> print(total)
44671.15
>>>
Diese Liste von Tupeln, die Sie erstellt haben, ist sehr ähnlich einem 2D-Array. Beispielsweise können Sie auf eine bestimmte Spalte und Zeile über einen Zugriff wie portfolio[row][column]
zugreifen, wobei row
und column
ganze Zahlen sind.
Allerdings können Sie auch die letzte for-Schleife mit einer Anweisung wie dieser umschreiben:
>>> total = 0.0
>>> for name, shares, price in portfolio:
total += shares*price
>>> print(total)
44671.15
>>>
Nehmen Sie die Funktion, die Sie in Übung 2.4 geschrieben haben, und ändern Sie sie so, dass jedes Aktie im Portfolio durch ein Dictionary statt eines Tupels dargestellt wird. Verwenden Sie in diesem Dictionary die Feldnamen "name", "shares" und "price", um die verschiedenen Spalten in der Eingabedatei darzustellen.
Experimentieren Sie mit dieser neuen Funktion auf die gleiche Weise wie in Übung 2.4.
>>> portfolio = read_portfolio('/home/labex/project/portfolio.csv')
>>> portfolio
[{'name': 'AA','shares': 100, 'price': 32.2}, {'name': 'IBM','shares': 50, 'price': 91.1},
{'name': 'CAT','shares': 150, 'price': 83.44}, {'name': 'MSFT','shares': 200, 'price': 51.23},
{'name': 'GE','shares': 95, 'price': 40.37}, {'name': 'MSFT','shares': 50, 'price': 65.1},
{'name': 'IBM','shares': 100, 'price': 70.44}]
>>> portfolio[0]
{'name': 'AA','shares': 100, 'price': 32.2}
>>> portfolio[1]
{'name': 'IBM','shares': 50, 'price': 91.1}
>>> portfolio[1]['shares']
50
>>> total = 0.0
>>> for s in portfolio:
total += s['shares']*s['price']
>>> print(total)
44671.15
>>>
Hier werden Sie bemerken, dass die verschiedenen Felder für jede Eingabe über Schlüsselnamen statt numerischer Spaltennummern zugegriffen werden. Dies ist oft bevorzugt, da der resultierende Code später einfacher lesbar ist.
Das Anzeigen großer Dictionaries und Listen kann chaotisch sein. Um die Ausgabe für das Debugging zu bereinigen, können Sie die pprint
-Funktion verwenden.
>>> from pprint import pprint
>>> pprint(portfolio)
[{'name': 'AA', 'price': 32.2,'shares': 100},
{'name': 'IBM', 'price': 91.1,'shares': 50},
{'name': 'CAT', 'price': 83.44,'shares': 150},
{'name': 'MSFT', 'price': 51.23,'shares': 200},
{'name': 'GE', 'price': 40.37,'shares': 95},
{'name': 'MSFT', 'price': 65.1,'shares': 50},
{'name': 'IBM', 'price': 70.44,'shares': 100}]
>>>
Ein Dictionary ist eine nützliche Möglichkeit, um Elemente zu verfolgen, wenn Sie Elemente mithilfe eines Index anderen als einer ganzen Zahl aufrufen möchten. Versuchen Sie im Python-Shell, mit einem Dictionary zu experimentieren:
>>> prices = { }
>>> prices['IBM'] = 92.45
>>> prices['MSFT'] = 45.12
>>> prices
... schauen Sie sich das Ergebnis an...
>>> prices['IBM']
92.45
>>> prices['AAPL']
... schauen Sie sich das Ergebnis an...
>>> 'AAPL' in prices
False
>>>
Die Datei prices.csv
enthält eine Reihe von Zeilen mit Aktienpreisen. Die Datei sieht ungefähr so aus:
"AA",9.22
"AXP",24.85
"BA",44.85
"BAC",11.27
"C",3.72
...
Schreiben Sie eine Funktion read_prices(filename)
, die eine Reihe von Preisen wie diese in ein Dictionary liest, wobei die Schlüssel des Dictionaries die Aktiennamen sind und die Werte im Dictionary die Aktienpreise sind.
Um dies zu tun, beginnen Sie mit einem leeren Dictionary und fügen Sie Werte hinein, genauso wie Sie es oben getan haben. Allerdings lesen Sie die Werte jetzt aus einer Datei.
Wir werden diese Datenstruktur verwenden, um schnell den Preis eines angegebenen Aktiennamens zu suchen.
Einige kleine Tipps, die Sie für diesen Teil benötigen. Zunächst stellen Sie sicher, dass Sie das csv
-Modul genauso verwenden wie zuvor - es ist hier nicht nötig, das Rad neu zu erfinden.
>>> import csv
>>> f = open('/home/labex/project/prices.csv', 'r')
>>> rows = csv.reader(f)
>>> for row in rows:
print(row)
['AA', '9.22']
['AXP', '24.85']
...
[]
>>>
Eine weitere kleine Komplikation ist, dass die Datei prices.csv
möglicherweise einige leere Zeilen enthält. Beachten Sie, wie die letzte Zeile der obigen Daten eine leere Liste ist - was bedeutet, dass keine Daten auf dieser Zeile vorhanden waren.
Es besteht die Möglichkeit, dass dies zu einem Absturz Ihres Programms mit einer Ausnahme führt. Verwenden Sie die try
- und except
-Anweisungen, um dies entsprechend zu fangen. Gedanke: Würde es besser sein, mit einer if
-Anweisung vor schlechten Daten zu schützen?
Sobald Sie Ihre read_prices()
-Funktion geschrieben haben, testen Sie sie interaktiv, um sicherzustellen, dass sie funktioniert:
>>> prices = read_prices('/home/labex/project/prices.csv')
>>> prices['IBM']
106.28
>>> prices['MSFT']
20.89
>>>
Verknüpfen Sie all diese Arbeiten, indem Sie einige zusätzliche Anweisungen zu Ihrem report.py
-Programm hinzufügen, das das Gewinn/Loss berechnet. Diese Anweisungen sollten die Liste von Aktien aus Übung 2.5 und das Dictionary von Preisen aus Übung 2.6 nehmen und den aktuellen Wert des Portfolios zusammen mit dem Gewinn/Loss berechnen.
Herzlichen Glückwunsch! Sie haben das Containers-Labor abgeschlossen. Sie können in LabEx weitere Labs ausprobieren, um Ihre Fähigkeiten zu verbessern.