una repite que palabra misma metodos mas llenar listas lista encontrar elementos elemento comparar buscar arreglos agregar python sortedlist

python - repite - ¿Cómo encontrar un índice en el que se pueda insertar un nuevo elemento en la lista ordenada y mantenerlo ordenado?



llenar una lista en python (3)

a = 132 b = [0, 10, 30, 60, 100, 150, 210, 280, 340, 480, 530]

Quiero saber que a debería estar en la sexta posición en la lista ordenada b .

¿Cuál es la forma más pitónica de hacerlo?


Hay más preocupación con los casos de borde. Por ejemplo, suponga que desea seleccionar los elementos en la b mencionada anteriormente en el rango de (a, c) y los selecciona usando

b[idx_a:idx_c]

entonces necesitas pensar en el caso donde a, c son en realidad elementos de b . Tenga en cuenta que

bisect.bisect(b, 10) bisect.bisect(b, 11)

ambos darían el índice 2. Por lo tanto, si a=10 debemos reducir el índice en 1. Afortunadamente, existe una función bisect.bisect_left que hace exactamente esto, es decir, en nuestro ejemplo

bisect.bisect_left(b, 10)

da 1.

En general, el índice de la izquierda se debe calcular utilizando bisect.bisect_left() y el índice de la derecha bisect.bisect_right() (que es lo mismo que bisect.bisect() ).


Utilice bisect . No es la API más hermosa, pero es exactamente lo que necesitas.

bisect.bisect usar bisect.bisect , que devuelve exactamente lo que desea.


bisect es un módulo en la biblioteca estándar de Python que es perfecto para esta tarea. La función bisect en el módulo bisect le dará el índice del punto de inserción para el valor.

Déjame dar un ejemplo de código para bisect

from bisect import bisect a = 132 b = [0, 10, 30, 60, 100, 150, 210, 280, 340, 480, 530] print(bisect(b, a))

El resultado será 5 porque la lista está basada en 0, por lo que en realidad es la sexta posición.

Lo que puede hacer es saber utilizar el resultado para un insert .

index = bisect(b, a) b.insert(index, a)

o sin la variable intermedia

b.insert(bisect(b, a), a)

Ahora b será [0, 10, 30, 60, 100, 132, 150, 210, 280, 340, 480, 530] .