Listenverständnis zur Verarbeitung von Elementen

PythonPythonBeginner
Jetzt üben

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

Einführung

Eine häufige Aufgabe besteht darin, Elemente in einer Liste zu verarbeiten. In diesem Abschnitt werden Listenverständnisse vorgestellt, ein leistungsstarkes Werkzeug dazu.

Dies ist ein Guided Lab, das schrittweise Anweisungen bietet, um Ihnen beim Lernen und Üben zu helfen. Befolgen Sie die Anweisungen sorgfältig, um jeden Schritt abzuschließen und praktische Erfahrungen zu sammeln. Historische Daten zeigen, dass dies ein Labor der Stufe Anfänger mit einer Abschlussquote von 91% ist. Es hat eine positive Bewertungsrate von 100% von den Lernenden erhalten.

Neuen Listen erstellen

Eine Listenverständnis erstellt eine neue Liste, indem eine Operation auf jedes Element einer Sequenz angewendet wird.

>>> a = [1, 2, 3, 4, 5]
>>> b = [2*x for x in a ]
>>> b
[2, 4, 6, 8, 10]
>>>

Ein weiteres Beispiel:

>>> names = ['Elwood', 'Jake']
>>> a = [name.lower() for name in names]
>>> a
['elwood', 'jake']
>>>

Die allgemeine Syntax lautet: [ <Ausdruck> für <Variablennamen> in <Sequenz> ].

Filtern

Sie können auch während des Listenverständnisses filtern.

>>> a = [1, -5, 4, 2, -2, 10]
>>> b = [2*x for x in a if x > 0 ]
>>> b
[2, 8, 4, 20]
>>>

Anwendungsfälle

Listenverständnisse sind äußerst nützlich. Beispielsweise können Sie die Werte eines bestimmten Dictionary-Felds sammeln:

stocknames = [s['name'] for s in stocks]

Sie können auf Sequenzen vergleichbare Abfragen wie in einer Datenbank durchführen.

a = [s for s in stocks if s['price'] > 100 und s['shares'] > 50 ]

Sie können auch ein Listenverständnis mit einer Sequenzreduzierung kombinieren:

cost = sum([s['shares']*s['price'] for s in stocks])

Allgemeine Syntax

[ <Ausdruck> für <Variablennamen> in <Sequenz> wenn <Bedingung>]

Was das bedeutet:

result = []
for variable_name in sequence:
    if condition:
        result.append(expression)

Historische Exkursion

Listenverständnisse stammen aus der Mathematik (Mengenbildungsnotation).

a = [ x * x for x in s if x > 0 ] ## Python

a = { x^2 | x ∈ s, x > 0 }         ## Mathematik

Es wird auch in mehreren anderen Sprachen implementiert. Die meisten Programmierer denken wahrscheinlich nicht an ihre Matheklasse. Es ist daher in Ordnung, es als eine coole Listenkürzung anzusehen.

Übung 2.19: Listenverständnisse

Probieren Sie ein paar einfache Listenverständnisse, um sich nur mit der Syntax vertraut zu machen.

>>> nums = [1,2,3,4]
>>> squares = [ x * x for x in nums ]
>>> squares
[1, 4, 9, 16]
>>> twice = [ 2 * x for x in nums if x > 2 ]
>>> twice
[6, 8]
>>>

Bemerken Sie, wie die Listenverständnisse eine neue Liste mit den Daten erzeugen, die geeignet transformiert oder gefiltert sind.

Übung 2.20: Sequenzreduzierungen

Berechnen Sie die Gesamtkosten des Portfolios mit einer einzigen Python-Anweisung.

>>> portfolio = read_portfolio('portfolio.csv')
>>> cost = sum([ s['shares'] * s['price'] for s in portfolio ])
>>> cost
44671.15
>>>

Nachdem Sie das getan haben, zeigen Sie, wie Sie den aktuellen Wert des Portfolios mit einer einzigen Anweisung berechnen können.

>>> value = sum([ s['shares'] * prices[s['name']] for s in portfolio ])
>>> value
28686.1
>>>

Beide obigen Operationen sind ein Beispiel für eine Map-Reduction. Die Listenverständnis bildet eine Operation über die Liste ab.

>>> [ s['shares'] * s['price'] for s in portfolio ]
[3220.0000000000005, 4555.0, 12516.0, 10246.0, 3835.1499999999996, 3254.9999999999995, 7044.0]
>>>

Die sum()-Funktion führt dann eine Reduzierung über das Ergebnis durch:

>>> sum(_)
44671.15
>>>

Mit diesem Wissen sind Sie jetzt bereit, eine Big-Data-Startup-Gesellschaft zu gründen.

Übung 2.21: Datenabfragen

Versuchen Sie die folgenden Beispiele verschiedener Datenabfragen.

Zunächst eine Liste aller Portfolio-Holdings mit mehr als 100 Aktien.

>>> more100 = [ s for s in portfolio if s['shares'] > 100 ]
>>> more100
[{'price': 83.44, 'name': 'CAT','shares': 150}, {'price': 51.23, 'name': 'MSFT','shares': 200}]
>>>

Alle Portfolio-Holdings für MSFT- und IBM-Aktien.

>>> msftibm = [ s for s in portfolio if s['name'] in {'MSFT','IBM'} ]
>>> msftibm
[{'price': 91.1, 'name': 'IBM','shares': 50}, {'price': 51.23, 'name': 'MSFT','shares': 200},
  {'price': 65.1, 'name': 'MSFT','shares': 50}, {'price': 70.44, 'name': 'IBM','shares': 100}]
>>>

Eine Liste aller Portfolio-Holdings, die mehr als 10000 Dollar kosten.

>>> cost10k = [ s for s in portfolio if s['shares'] * s['price'] > 10000 ]
>>> cost10k
[{'price': 83.44, 'name': 'CAT','shares': 150}, {'price': 51.23, 'name': 'MSFT','shares': 200}]
>>>

Übung 2.22: Datenextraktion

Zeigen Sie, wie Sie eine Liste von Tupeln (name, shares) erstellen könnten, wobei name und shares aus portfolio entnommen werden.

>>> name_shares =[ (s['name'], s['shares']) for s in portfolio ]
>>> name_shares
[('AA', 100), ('IBM', 50), ('CAT', 150), ('MSFT', 200), ('GE', 95), ('MSFT', 50), ('IBM', 100)]
>>>

Wenn Sie die eckigen Klammern ([, ]) durch geschweifte Klammern ({, }) ersetzen, erhalten Sie etwas, das als Mengenverständnis bekannt ist. Dies liefert Ihnen einzigartige oder unterschiedliche Werte.

Zum Beispiel bestimmt dies die Menge der einzigartigen Aktiennamen, die in portfolio auftauchen:

>>> names = { s['name'] for s in portfolio }
>>> names
{ 'AA', 'GE', 'IBM', 'MSFT', 'CAT' }
>>>

Wenn Sie Schlüssel:Wert-Paare angeben, können Sie ein Wörterbuch erstellen. Beispielsweise erstellen Sie ein Wörterbuch, das den Namen einer Aktie auf die Gesamtzahl der gehaltenen Aktien abbildet.

>>> holdings = { name: 0 for name in names }
>>> holdings
{'AA': 0, 'GE': 0, 'IBM': 0, 'MSFT': 0, 'CAT': 0}
>>>

Dieses letzte Feature ist als Wörterbuchverständnis bekannt. Tabellieren wir:

>>> for s in portfolio:
        holdings[s['name']] += s['shares']

>>> holdings
{ 'AA': 100, 'GE': 95, 'IBM': 150, 'MSFT':250, 'CAT': 150 }
>>>

Versuchen Sie dieses Beispiel, das das prices-Wörterbuch auf nur die Namen reduziert, die in portfolio auftauchen:

>>> portfolio_prices = { name: prices[name] for name in names }
>>> portfolio_prices
{'AA': 9.22, 'GE': 13.48, 'IBM': 106.28, 'MSFT': 20.89, 'CAT': 35.46}
>>>

Übung 2.23: Extrahieren von Daten aus CSV-Dateien

Das Wissen, wie verschiedene Kombinationen von Listen-, Mengen- und Wörterbuchverständnissen verwendet werden können, kann in verschiedenen Formen der Datenverarbeitung nützlich sein. Hier ist ein Beispiel, das zeigt, wie man ausgewählte Spalten aus einer CSV-Datei extrahiert.

Zunächst lesen Sie eine Zeile mit Header-Informationen aus einer CSV-Datei:

>>> import csv
>>> f = open('portfoliodate.csv')
>>> rows = csv.reader(f)
>>> headers = next(rows)
>>> headers
['name', 'date', 'time','shares', 'price']
>>>

Als nächstes definieren Sie eine Variable, die die Spalten auflistet, die Sie tatsächlich interessieren:

>>> select = ['name','shares', 'price']
>>>

Legen Sie nun die Indizes der obigen Spalten in der Quell-CSV-Datei fest:

>>> indices = [ headers.index(colname) for colname in select ]
>>> indices
[0, 3, 4]
>>>

Schließlich lesen Sie eine Zeile von Daten und wandeln sie mithilfe eines Wörterbuchverständnisses in ein Wörterbuch um:

>>> row = next(rows)
>>> record = { colname: row[index] for colname, index in zip(select, indices) }   ## dict-comprehension
>>> record
{'price': '32.20', 'name': 'AA','shares': '100'}
>>>

Wenn Sie sich mit dem, was gerade passiert ist, wohlfühlen, lesen Sie den Rest der Datei:

>>> portfolio = [ { colname: row[index] for colname, index in zip(select, indices) } for row in rows ]
>>> portfolio
[{'price': '91.10', 'name': 'IBM','shares': '50'}, {'price': '83.44', 'name': 'CAT','shares': '150'},
  {'price': '51.23', 'name': 'MSFT','shares': '200'}, {'price': '40.37', 'name': 'GE','shares': '95'},
  {'price': '65.10', 'name': 'MSFT','shares': '50'}, {'price': '70.44', 'name': 'IBM','shares': '100'}]
>>>

Oh je, Sie haben gerade einen Großteil der read_portfolio()-Funktion auf eine einzelne Anweisung reduziert.

Kommentar

Listenverständnisse werden in Python häufig als effiziente Methode zur Transformation, Filterung oder Sammlung von Daten verwendet. Aufgrund der Syntax sollten Sie nicht übertreiben – versuchen Sie, jedes Listenverständnis so einfach wie möglich zu halten. Es ist in Ordnung, die Dinge in mehrere Schritte aufzuteilen. Beispielsweise wäre es nicht klar, dass Sie das letzte Beispiel auf Ihre unversehens überraschten Kollegen loswerfen möchten.

Allerdings ist das Wissen, wie man Daten schnell manipulieren kann, eine Fähigkeit, die ungemein nützlich ist. Es gibt zahlreiche Situationen, in denen Sie möglicherweise ein einmaliges Problem lösen müssen, das Datenimport, -export, -extraktion usw. umfasst. Ein Guru in Sachen Listenverständnissen kann die Zeit, die für die Lösung einer Aufgabe benötigt wird, erheblich reduzieren. Vergessen Sie auch nicht das collections-Modul.

Zusammenfassung

Herzlichen Glückwunsch! Sie haben das Lab zu Listenverständnissen abgeschlossen. Sie können in LabEx weitere Labs absolvieren, um Ihre Fähigkeiten zu verbessern.