Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python Enhancement Proposals

PEP 274 – Dict Comprehensions

Autor:
Barry Warsaw <barry at python.org>
Status:
Final
Typ:
Standards Track
Erstellt:
25. Okt. 2001
Python-Version:
2.7, 3.0
Post-History:
29. Okt. 2001

Inhaltsverzeichnis

Zusammenfassung

PEP 202 führt eine syntaktische Erweiterung für Python ein, die als „List Comprehension“ bezeichnet wird. Dieses PEP schlägt eine ähnliche syntaktische Erweiterung vor, die als „Dictionary Comprehension“ oder kurz „dict comprehension“ bezeichnet wird. Sie können Dict Comprehensions auf eine Weise verwenden, die Listen-Comprehensions sehr ähnlich ist, außer dass sie Python-Dictionary-Objekte anstelle von Listen-Objekten erzeugen.

Entscheidung

Dieses PEP wurde ursprünglich für die Aufnahme in Python 2.3 geschrieben. Es wurde zurückgezogen, nachdem festgestellt wurde, dass praktisch alle seine Vorteile durch Generatorausdrücke in Verbindung mit dem Konstruktor dict() abgedeckt wurden.

Python 2.7 und 3.0 führen jedoch genau diese Funktion ein, sowie die eng verwandten Set Comprehensions. Am 09.04.2012 wurde das PEP geändert, um diese Realität widerzuspiegeln, indem sein Status auf „Accepted“ aktualisiert und das Feld „Python-Version“ aktualisiert wurde. Der Abschnitt „Offene Fragen“ wurde ebenfalls entfernt, da diese durch die aktuelle Implementierung längst gelöst sind.

Vorgeschlagene Lösung

Dict Comprehensions sind genau wie List Comprehensions, nur dass Sie den Ausdruck mit geschweiften Klammern anstelle von eckigen Klammern gruppieren. Außerdem drückt der linke Teil vor dem Schlüsselwort for sowohl einen Schlüssel als auch einen Wert aus, getrennt durch einen Doppelpunkt. Die Notation ist speziell so gestaltet, dass sie an List Comprehensions erinnert, die auf Dictionaries angewendet werden.

Begründung

Es gibt Situationen, in denen Sie einige Daten als Sequenz von Sequenzen der Länge 2 haben und diese in ein Dictionary umwandeln möchten. In Python 2.2 akzeptiert der Konstruktor dict() ein Argument, das eine Sequenz von Sequenzen der Länge 2 ist, die als (Schlüssel, Wert)-Paare verwendet werden, um ein neues Dictionary-Objekt zu initialisieren.

Das Umwandeln einiger Daten in eine Sequenz von Sequenzen der Länge 2 kann jedoch aus Speicher- oder Leistungssicht umständlich oder ineffizient sein. Auch bei einigen gängigen Operationen, wie z. B. dem Umwandeln einer Liste von Elementen in eine Menge von Elementen für schnelle Duplikaterkennung oder Mengentest, kann eine bessere Syntax die Klarheit des Codes verbessern.

Wie bei List Comprehensions kann immer eine explizite for-Schleife verwendet werden (und war tatsächlich die einzige Möglichkeit, dies in früheren Versionen von Python zu tun). Aber wie bei List Comprehensions können Dict Comprehensions ein syntaktisch prägnanteres Idiom als die traditionelle for-Schleife darstellen.

Semantik

Die Semantik von Dict Comprehensions kann tatsächlich in Standard-Python 2.2 demonstriert werden, indem eine List Comprehension an den integrierten Dictionary-Konstruktor übergeben wird

>>> dict([(i, chr(65+i)) for i in range(4)])

ist semantisch äquivalent zu

>>> {i : chr(65+i) for i in range(4)}

Der Ansatz mit dem Dictionary-Konstruktor hat jedoch zwei deutliche Nachteile gegenüber der vorgeschlagenen Syntax. Erstens ist er nicht so lesbar wie eine Dict Comprehension. Zweitens zwingt er den Programmierer, zuerst ein In-Core-Listenobjekt zu erstellen, was teuer sein kann.

Beispiele

>>> print {i : chr(65+i) for i in range(4)}
{0 : 'A', 1 : 'B', 2 : 'C', 3 : 'D'}
>>> print {k : v for k, v in someDict.iteritems()} == someDict.copy()
1
>>> print {x.lower() : 1 for x in list_of_email_addrs}
{'barry@zope.com'   : 1, 'barry@python.org' : 1, 'guido@python.org' : 1}
>>> def invert(d):
...     return {v : k for k, v in d.iteritems()}
...
>>> d = {0 : 'A', 1 : 'B', 2 : 'C', 3 : 'D'}
>>> print invert(d)
{'A' : 0, 'B' : 1, 'C' : 2, 'D' : 3}
>>> {(k, v): k+v for k in range(4) for v in range(4)}
... {(3, 3): 6, (3, 2): 5, (3, 1): 4, (0, 1): 1, (2, 1): 3,
   (0, 2): 2, (3, 0): 3, (0, 3): 3, (1, 1): 2, (1, 0): 1,
   (0, 0): 0, (1, 2): 3, (2, 0): 2, (1, 3): 4, (2, 2): 4, (
   2, 3): 5}

Implementierung

Alle Implementierungsdetails wurden im Zeitraum Python 2.7 und 3.0 gelöst.


Quelle: https://github.com/python/peps/blob/main/peps/pep-0274.rst

Zuletzt geändert: 2025-02-01 08:59:27 GMT