2009-12-19 9 views
7

Al tener una lista ordenada y algún valor aleatorio, me gustaría encontrar en qué rango se encuentra el valor.Una manera pitónica de encontrar si un valor está entre dos valores en una lista

lista es la siguiente: [0, 5, 10, 15, 20] Y el valor es, dicen 8.

La manera estándar sería ir ya sea desde el principio hasta que llegamos valor que es más grande que la nuestra (como en el ejemplo a continuación), o para realizar binary search.

grid = [0, 5, 10, 15, 20] 
value = 8 
result_index = 0 
while result_index < len(grid) and grid[result_index] < value: 
    result_index += 1 

print result_index 

Me pregunto si hay un enfoque más Pythonic, ya que aunque corta, se ve poco de un dolor del ojo. ¡Gracias por su tiempo!

Respuesta

20
>>> import bisect 
>>> grid = [0, 5, 10, 15, 20] 
>>> value = 8 
>>> bisect.bisect(grid, value) 
2 

Editar:

bisect — Array bisection algorithm

+1

+1, se me adelantó por diez segundos. Sin embargo, valdría la pena vincularlo con los documentos de stdlib. – Kiv

+0

¡supongo que no encontré los términos correctos para buscar! ¡Muchas gracias, esto es exactamente lo que estaba buscando! –

+0

¡Oh, Dios mío, otro idioma MOJADO! :) Es curioso ver cómo Python (aunque padece un sistema de tipo rígido como Java) te obliga a escribir todo dos veces. – akuhn

1
for min, max in zip(grid, grid[1:]): # [(0, 5), (5, 10), (10, 15), (15, 20), (20, 25)] 
    if max <= value < min: #previously: if value in xrange(min, max): 
    return min, max 
raise ValueError("value out of range") 
+0

+1 ¡esto también se ve bien! –

+0

¿Qué sucede si 'value = 2, grid = [3, 2 ** 30]'? –

+0

Si su cuadrícula es '[3, 2 ** 30] 'es probable que tenga un problema mayor que este. El verdadero problema de esta solución es que solo funciona para valores enteros de 'valor'. – badp

Cuestiones relacionadas