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]
.