2009-12-19 6 views
7

एक क्रमबद्ध सूची और कुछ यादृच्छिक मान होने के बाद, मैं यह जानना चाहता हूं कि मूल्य किस श्रेणी में है।एक पाइथोनिक तरीका यह पता लगाने के लिए कि कोई मान किसी सूची में दो मानों के बीच है या नहीं

सूची इस प्रकार है: [0, 5, 10, 15, 20] और मूल्य है, का कहना है 8.

मानक तरीका करने के लिए या तो शुरू से ही जाना जब तक हम मूल्य कि तुलना में बड़ा है पर मारते थे हमारा (नीचे दिए गए उदाहरण में), या 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 

मैं अगर वहाँ एक और अधिक pythonic तरीका है, के रूप में इस छोटे से हालांकि, एक आंख पीड़ादायक का सा लग रहा है सोच रहा हूँ। आपके समय के लिए धन्यवाद!

उत्तर

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

संपादित करें:

bisect — Array bisection algorithm

+1

+1, दस सेकंड से यह करने के लिए मुझे हराया। हालांकि stdlib दस्तावेज़ों को जोड़ने के लायक होगा। – Kiv

+0

मुझे लगता है कि मुझे खोजने के लिए सही शब्द नहीं मिला! बहुत बहुत धन्यवाद, यह वही है जो मैं ढूंढ रहा था! –

+0

ओ गोश, एक और WET भाषा! :) यह देखने के लिए हास्यास्पद है कि कैसे पाइथन (जावा के रूप में एक कठोर प्रकार प्रणाली से पीड़ित होने के बावजूद) फिर भी आप सबकुछ दो बार लिखने के लिए मजबूर करते हैं। – 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 यह भी अच्छा लग रहा है! –

+0

क्या होता है यदि 'value = 2, ग्रिड = [3, 2 ** 30]'? –

+0

यदि आपका ग्रिड '[3, 2 ** 30] है तो संभावना है कि आपको इससे भी बदतर परेशानी होगी। इस समाधान की वास्तविक समस्या यह है कि यह केवल 'मान' के पूर्णांक मानों के लिए काम करता है। – badp

संबंधित मुद्दे

 संबंधित मुद्दे