2010-07-07 21 views
16

¿Existen complementos de Python o bibliotecas de Python ampliamente utilizadas para realizar una búsqueda en una secuencia ordenada?¿Buscar en una lista ordenada?

+1

Secuencia de qué? Además, ¿qué tipo de búsqueda (binaria, etc.)? –

+0

Creo que la pregunta es tratar de ser "canónico" o "genérico" y el significado de "secuencia" puede estar usando la [definición de documentación de Python de una 'secuencia' (es decir, python 2.x" Hay siete tipos de secuencia: cadenas, cadenas Unicode, listas, tuplas, bytearrays, búferes y objetos xrange. ")] (https://docs.python.org/2/library/stdtypes.html#sequence-types-str-unicode-list-tuple -bytearray-buffer-xrange) –

Respuesta

22

bisect es parte de la biblioteca estándar, ¿es ese el tipo de cosa que está buscando?

+0

que no explica cómo buscar el valor en la lista. –

13

Vale la pena señalar que hay un par de bibliotecas de Python de alta calidad para mantener una lista ordenada que también implementa la búsqueda rápida: sortedcontainers y blist. Usar estos depende, por supuesto, de la frecuencia con la que insertes/elimines elementos de la lista y necesites buscar. Cada uno de esos módulos proporciona una clase SortedList que mantiene los elementos en orden de manera eficiente.

De la documentación para SortedList:

L.bisect_left(value) 
    Similar to the bisect module in the standard library, this returns 
    an appropriate index to insert value in L. If value is already present 
    in L, the insertion point will be before (to the left of) any existing 
    entries. 

L.bisect(value) 
    Same as bisect_left. 

L.bisect_right(value) 
    Same as bisect_left, but if value is already present in L, the 
    insertion point will be after (to the right of) any existing entries. 

Ambas implementaciones usar la búsqueda binaria para encontrar el índice correcto del valor dado. Hay una página performance comparison para elegir entre los dos módulos.

Descargo de responsabilidad: Soy el autor del módulo sortedcontainers.

Cuestiones relacionadas