2009-12-19 5 views
7

Ayant une liste triée et une valeur aléatoire, je voudrais trouver dans quelle plage la valeur est.Une façon pythonique de trouver si une valeur est entre deux valeurs dans une liste

Liste va comme ceci: [0, 5, 10, 15, 20] Et la valeur est, disons 8.

La méthode standard serait d'aller soit du début jusqu'à ce que nous valorisons frappé qui est plus grand que le nôtre (comme dans l'exemple ci-dessous), ou pour effectuer 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 

Je me demande s'il y a une approche plus pythonique, comme cela, bien que court, semble peu d'un oeil douloureux. Merci pour votre temps!

Répondre

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

Edit:

bisect — Array bisection algorithm

+1

+1, me devança de dix secondes. Cela vaudrait la peine d'être lié aux documents stdlib. – Kiv

+0

Je suppose que je n'ai pas trouvé les bons termes pour rechercher avec! Merci beaucoup, c'est exactement ce que je cherchais! –

+0

O gosh, une autre langue WET! :) drôle de voir comment python (même si souffrir d'un système de type rigide comme Java) vous oblige néanmoins à tout écrire deux fois. – 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 cela semble bien aussi! –

+0

Que se passe-t-il si 'value = 2, grid = [3, 2 ** 30]'? –

+0

Si votre grille est '[3, 2 ** 30], vous avez probablement de plus gros problèmes. Le vrai problème de cette solution est qu'elle ne fonctionne que pour les valeurs entières de 'value'. – badp

Questions connexes