2009-12-19 13 views
7

Avendo una lista ordinata e qualche valore casuale, vorrei trovare in quale intervallo il valore è.Un modo pietonico come trovare se un valore si trova tra due valori in una lista

Lista va in questo modo: [0, 5, 10, 15, 20] e il valore è, dicono 8.

Il metodo standard sarebbe quello di andare sia dall'inizio fino a quando ci ha colpito valore che è più grande di nostro (come nell'esempio sotto), o per eseguire 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 

Mi chiedo se non v'è un approccio più divinatorio, in quanto questo anche se breve, sembra po 'di un occhio dolente. Grazie per il tuo tempo!

risposta

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

Edit:

bisect — Array bisection algorithm

+1

+1, mi ha battuto sul tempo da dieci secondi. Sarebbe comunque utile collegare i documenti stdlib. – Kiv

+0

Immagino di non aver trovato i termini giusti per cercare! Grazie mille, questo è esattamente quello che stavo cercando! –

+0

O Dio, un'altra lingua WET! :) divertente vedere come Python (anche se a soffrire di un sistema di tipo rigido come Java) tuttavia ti costringe a scrivere tutto due volte. – 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 anche questo sembra bello! –

+0

Cosa succede se 'value = 2, grid = [3, 2 ** 30]'? –

+0

Se la tua griglia è '[3, 2 ** 30]' è probabile che tu abbia problemi peggiori di questo. Il vero problema di questa soluzione è che funziona solo con valori interi di 'value'. – badp