2009-12-19 23 views
7

Sıralanmış bir liste ve rasgele bir değer olması, değerin hangi aralıkta olduğunu bulmak istiyorum. [0, 5, 10, 15, 20] Ve değerdir, 8.Bir değer bir listede iki değer arasında olup olmadığını bulmak için bir pythonic yolu

standart yolu olmak ya biz daha büyük değere çarpana kadar baştan giderdim ki:

Liste böyle gider bizimki (aşağıdaki örnekte olduğu gibi) veya binary search'u gerçekleştirin. Bu kısa olmasına rağmen göz yara biraz görünüyor gibi daha pythonic yaklaşım varsa

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 

merak ediyorum. Zaman ayırdığınız için teşekkür ederiz!

cevap

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

Düzenleme:

+1

+1

bisect — Array bisection algorithm, on saniye tarafından kendisine beni yendi. Gerçi stdlib dokümanlar ile bağlantı kurmaya değecek. – Kiv

+0

Sanırım arama yapmak için doğru şartları bulamadım! Çok teşekkür ederim, tam da aradığım şey bu! –

+0

Ey, başka bir WET dili! :) python'un (Java gibi katı bir sistemden muzdarip olsa bile) herşeyi iki kere yazmaya zorladığını görmek çok eğlenceli. – 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 bu da güzel görünüyor! –

+0

'value = 2, grid = [3, 2 ** 30]' durumunda ne olur? –

+0

Eğer ızgaranız '' [3, 2 ** 30] 'ise, bundan daha kötü belalarınız var demektir. Bu çözümün asıl sorunu, yalnızca "değer" in tamsayı değerleri için çalıştığıdır. – badp