¿Existe una decisión de diseño de Python (PEP) que impida que se agregue un contenedor ordenado a Python?
( OrderedDict
no es un contenedor ordenado ya que está ordenado por orden de inserción).
¿Existe una decisión de diseño de Python (PEP) que impida que se agregue un contenedor ordenado a Python?
( OrderedDict
no es un contenedor ordenado ya que está ordenado por orden de inserción).
Respuestas:
Es una decisión de diseño consciente por parte de Guido (incluso se mostró algo reacio con respecto a la adición del
collections
módulo). Su objetivo es preservar "una forma obvia de hacerlo" cuando se trata de la selección de tipos de datos para aplicaciones.El concepto básico es que si un usuario es lo suficientemente sofisticado como para darse cuenta de que los tipos integrados no son la solución adecuada para su problema, entonces también está a la altura de la tarea de encontrar una biblioteca de terceros adecuada.
Dado que list + sorting, list + heapq y list + bisect cubren muchos de los casos de uso que de otra manera se basarían en estructuras de datos ordenadas inherentemente, y existen paquetes como blist, no hay un gran impulso para agregar más complejidad en este espacio para la biblioteca estándar.
De alguna manera, es similar al hecho de que no hay una matriz multidimensional en la biblioteca estándar, sino que cede esa tarea a la gente de NumPy.
fuente
collections.Counter
se puede utilizar como conjunto ordenado. Aunque puede que no sea eficaz.collections.Counter
no está ordenado y no es apropiado para representar un conjunto ordenado.dict
es una tabla hash.También hay un módulo de contenedores ordenados de Python que implementa tipos ordenados de lista, dictado y conjunto. Es muy similar a blist pero implementado en Python puro y en la mayoría de los casos más rápido .
>>> from sortedcontainers import SortedSet >>> ss = SortedSet([3, 7, 2, 2]) >>> ss SortedSet([2, 3, 7])
También tiene una funcionalidad poco común en otros paquetes:
>>> from sortedcontainers import SortedDict >>> sd = SortedDict((num, num) for num in range(100000)) >>> sd.iloc[-5] # Lookup the fifth-to-last key. 99995
Descargo de responsabilidad: soy el autor del módulo sortedcontainers.
fuente
También está el módulo blist que contiene un tipo de datos de conjunto ordenado :
sortedset(iterable=(), key=None) >>> from blist import sortedset >>> my_set = sortedset([3,7,2,2]) sortedset([2, 3, 7]
fuente
No es exactamente un "contenedor ordenado", pero puede que le interese el módulo bisecto de la biblioteca estándar , que "proporciona soporte para mantener una lista en orden ordenado sin tener que ordenar la lista después de cada inserción".
fuente
Hay un
heapq
en la biblioteca estándar, no está exactamente ordenado, pero es un poco. También hay un paquete blist , pero no está en la biblioteca estándar.fuente
Las listas de Python están ordenadas. Si los clasifica, se quedan así. En Python 2.7
OrderedDict
se agregó un tipo para mantener un diccionario ordenado explícitamente.Python también tiene conjuntos (una colección en la que los miembros deben ser únicos), pero por definición no están ordenados. Ordenar un conjunto solo devuelve un
list
.fuente