Buscar rangos de valores en Python con bisect

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

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

¡CONVOCATORIA ABIERTA!

Desarrollo de apps móviles ios & Android

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado

KeepCoding Bootcamps
Resumen de privacidad

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.