Gibt es eine Python-Entwurfsentscheidung (PEP), die verhindert, dass ein sortierter Container zu Python hinzugefügt wird?
( OrderedDict
ist kein sortierter Behälter, da er nach Einfügereihenfolge sortiert ist.)
Gibt es eine Python-Entwurfsentscheidung (PEP), die verhindert, dass ein sortierter Container zu Python hinzugefügt wird?
( OrderedDict
ist kein sortierter Behälter, da er nach Einfügereihenfolge sortiert ist.)
Antworten:
Es ist eine bewusste Designentscheidung von Guido (er war sogar etwas zurückhaltend in Bezug auf das Hinzufügen des collections
Moduls). Sein Ziel ist es, "einen offensichtlichen Weg zu finden", wenn es um die Auswahl von Datentypen für Anwendungen geht.
Das Grundkonzept besteht darin, dass ein Benutzer, der hoch genug ist, um zu erkennen, dass die integrierten Typen nicht die richtige Lösung für sein Problem sind, auch die Aufgabe hat, eine geeignete Bibliothek eines Drittanbieters zu finden.
Angesichts der Tatsache, dass list + sorting, list + heapq und list + bisect viele der Anwendungsfälle abdecken, die ansonsten auf inhärent sortierten Datenstrukturen beruhen würden, und Pakete wie blist existieren, gibt es keinen großen Antrieb, um diesem Bereich mehr Komplexität zu verleihen die Standardbibliothek.
In gewisser Weise ähnelt es der Tatsache, dass die Standardbibliothek kein mehrdimensionales Array enthält, sondern diese Aufgabe an die NumPy-Leute abgibt.
collections.Counter
kann als sortierter Satz verwendet werden. Obwohl es möglicherweise nicht effizient ist.
collections.Counter
ist unsortiert und nicht für die Darstellung einer sortierten Menge geeignet.
dict
ist eine Hash-Tabelle.
Es gibt auch ein Python- Modul für sortierte Container , das sortierte Listen-, Diktat- und Set-Typen implementiert. Es ist Blist sehr ähnlich, aber in reinem Python implementiert und in den meisten Fällen schneller .
>>> from sortedcontainers import SortedSet
>>> ss = SortedSet([3, 7, 2, 2])
>>> ss
SortedSet([2, 3, 7])
Es hat auch Funktionen, die für andere Pakete ungewöhnlich sind:
>>> from sortedcontainers import SortedDict
>>> sd = SortedDict((num, num) for num in range(100000))
>>> sd.iloc[-5] # Lookup the fifth-to-last key.
99995
Haftungsausschluss: Ich bin der Autor des Moduls sortierte Container.
Es gibt auch das Blist- Modul, das einen sortierten Datentyp enthält :
sortedset(iterable=(), key=None)
>>> from blist import sortedset
>>> my_set = sortedset([3,7,2,2])
sortedset([2, 3, 7]
Nicht gerade ein "sortierter Container", aber Sie könnten an dem Halbierungsmodul der Standardbibliothek interessiert sein , das "Unterstützung für die Verwaltung einer Liste in sortierter Reihenfolge bietet, ohne die Liste nach jedem Einfügen sortieren zu müssen".
Python-Listen sind geordnet. Wenn Sie sie sortieren, bleiben sie so. In Python 2.7 wurde ein OrderedDict
Typ hinzugefügt, um ein explizit geordnetes Wörterbuch zu verwalten.
Python hat auch Mengen (eine Sammlung, in der die Mitglieder eindeutig sein müssen), aber per Definition sind sie ungeordnet. Das Sortieren eines Satzes gibt nur a zurück list
.