Einführung
Das Modul collections bietet eine Reihe nützlicher Objekte für die Datenverarbeitung. Dieser Teil stellt einige dieser Funktionen kurz vor.
Beispiel: Zählen von Dingen
Angenommen, Sie möchten die Gesamtanteile jeder Aktie tabellieren.
portfolio = [
('GOOG', 100, 490.1),
('IBM', 50, 91.1),
('CAT', 150, 83.44),
('IBM', 100, 45.23),
('GOOG', 75, 572.45),
('AA', 50, 23.15)
]
In dieser Liste gibt es zwei Einträge für IBM und zwei Einträge für GOOG. Die Anteile müssen auf irgend eine Weise zusammengefasst werden.
Zähler
Lösung: Verwenden Sie einen Counter.
from collections import Counter
total_shares = Counter()
for name, shares, price in portfolio:
total_shares[name] += shares
total_shares['IBM'] ## 150
Beispiel: Eindeutige-Mehrdeutige Zuordnungen
Problem: Sie möchten einen Schlüssel zu mehreren Werten zuordnen.
portfolio = [
('GOOG', 100, 490.1),
('IBM', 50, 91.1),
('CAT', 150, 83.44),
('IBM', 100, 45.23),
('GOOG', 75, 572.45),
('AA', 50, 23.15)
]
Wie im vorherigen Beispiel sollte der Schlüssel IBM stattdessen zwei verschiedene Tupel haben.
Lösung: Verwenden Sie ein defaultdict.
from collections import defaultdict
holdings = defaultdict(list)
for name, shares, price in portfolio:
holdings[name].append((shares, price))
holdings['IBM'] ## [ (50, 91.1), (100, 45.23) ]
Das defaultdict stellt sicher, dass Sie jedes Mal, wenn Sie auf einen Schlüssel zugreifen, einen Standardwert erhalten.
Beispiel: Ein Verlauf aufzeichnen
Problem: Wir möchten einen Verlauf der letzten N Dinge haben. Lösung: Verwenden Sie eine deque.
from collections import deque
history = deque(maxlen=N)
with open(filename) as f:
for line in f:
history.append(line)
...
Das Modul collections ist möglicherweise eines der nützlichsten Bibliotheksmodule für die Behandlung spezieller Arten von Datenverarbeitungsaufgaben wie der Tabellierung und Indizierung.
In dieser Übung betrachten wir einige einfache Beispiele. Beginnen Sie, indem Sie Ihr Programm report.py ausführen, so dass Sie das Aktienportfolio im interaktiven Modus geladen haben.
$ python3 -i report.py
Übung 2.18: Tabellieren mit Zählern
Angenommen, Sie möchten die Gesamtzahl der Anteile jeder Aktie tabellieren. Dies ist mit Counter-Objekten einfach. Probieren Sie es aus:
>>> portfolio = read_portfolio('portfolio.csv')
>>> from collections import Counter
>>> holdings = Counter()
>>> for s in portfolio:
holdings[s['name']] += s['shares']
>>> holdings
Counter({'MSFT': 250, 'IBM': 150, 'CAT': 150, 'AA': 100, 'GE': 95})
>>>
Beobachten Sie genau, wie die mehreren Einträge für MSFT und IBM in portfolio hier zu einem einzelnen Eintrag zusammengefasst werden.
Sie können einen Zähler genauso wie ein Wörterbuch verwenden, um einzelne Werte abzurufen:
>>> holdings['IBM']
150
>>> holdings['MSFT']
250
>>>
Wenn Sie die Werte rangieren möchten, tun Sie Folgendes:
>>> ## Holen Sie sich die drei am häufigsten gehaltenen Aktien
>>> holdings.most_common(3)
[('MSFT', 250), ('IBM', 150), ('CAT', 150)]
>>>
Lassen Sie uns ein weiteres Aktienportfolio holen und einen neuen Zähler erstellen:
>>> portfolio2 = read_portfolio('portfolio2.csv')
>>> holdings2 = Counter()
>>> for s in portfolio2:
holdings2[s['name']] += s['shares']
>>> holdings2
Counter({'HPQ': 250, 'GE': 125, 'AA': 50, 'MSFT': 25})
>>>
Schließlich vereinigen wir alle Anteile mit einer einfachen Operation:
>>> holdings
Counter({'MSFT': 250, 'IBM': 150, 'CAT': 150, 'AA': 100, 'GE': 95})
>>> holdings2
Counter({'HPQ': 250, 'GE': 125, 'AA': 50, 'MSFT': 25})
>>> combined = holdings + holdings2
>>> combined
Counter({'MSFT': 275, 'HPQ': 250, 'GE': 220, 'AA': 150, 'IBM': 150, 'CAT': 150})
>>>
Dies ist nur ein kleiner Vorgeschmack dessen, was Zähler bieten. Wenn Sie sich jedoch einmal merken, dass Sie Werte tabellieren müssen, sollten Sie einen davon in Betracht ziehen.
Kommentar: Modul collections
Das Modul collections ist eines der nützlichsten Bibliotheksmodule in der gesamten Python-Welt. Tatsächlich könnten wir sogar einen erweiterten Tutorial dazu machen. Allerdings würde das auch zu einem Ablenkung sein. Lassen Sie collections für jetzt auf Ihrer Liste der Bettzeitlektüre stehen, um es später zu lesen.
Zusammenfassung
Herzlichen Glückwunsch! Sie haben das Labor zu dem Modul Collections abgeschlossen. Sie können in LabEx weitere Labs ausprobieren, um Ihre Fähigkeiten zu verbessern.