Buscar rangos de valores en Python con bisect

| Última modificación: 8 de marzo de 2024 | Tiempo de Lectura: 1 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

Supongamos que estás trabajando con un algoritmo que evalúa la idoneidad de un cliente de un banco para varios productos financieros. Se les asigna a los clientes una puntuación de 0 a 100 y hay que decretar qué producto le conviene a cada cliente.

Los puntos de corte, que determinan el producto que se va a ofrecer, los siguientes:

  • Hasta 60 recibe producto E.
  • De 60 a 70 recibe producto D.
  • De 70 a 80 recibe producto C.
  • De 80 a 90 recibe producto B.
  • Más de 90, recibe producto A.

Esto tiene pinta de un if con bastantes ramas. Si la clasificación fuese mucho mayor (en vez de 5 grupos, 50) sería una locura.

bisect has entered the chat

De la misma manera que los dicts son la herramienta ideal para buscar valores concretos, bisect es la herramienta ideal para buscar rangos de valores.

import bisect
cortes = [60,70,80,90]
productos = ‘EDCBA’

Cuando un punto cae justo en el punto de corte (por ejemplo, 60), la función bisect_right lo clasifica en el intervalo de la derecha. Si hace falta, hay otra función bisect_left.

bisect.bisect_right(cortes, 80) # devuelve 3 (el tercer intervalo)
productos[bisect.bisect_right(cortes, 80) ] # devuelve ‘B’

Esto mismo lo podemos meter dentro de una list comprehension y obtenemos directamente la lista de productos a partir de la lista de puntuaciones:

[productos[bisect.bisect_left(cortes, puntuacion)] for puntuacion in [30, 45, 67, 78, 89, 80]]
Fernando Rodríguez

iOS Developer & Co-Fundador de KeepCoding

Posts más leídos