2010-02-10 17 views
41

एक्स से अधिक की सूची में पहली अनुक्रमणिका खोजने के लिए सबसे पाइथोनिक तरीका क्या होगा?एक्स से पहले पाइथन सूची सूचकांक?

उदाहरण के लिए,

list = [0.5, 0.3, 0.9, 0.8] 

समारोह के साथ

f(list, 0.7) 

वापसी होगी

2. 
+29

एक चर नाम के रूप में 'सूची' का प्रयोग नहीं करते ... – mshsayem

+9

तुम्हारा मतलब है "pythonic": itertools.takewhile पाश एक बार हालत बन झूठी पहली बार टूट जाएगा। Http://www.urbandictionary.com/define.php?term=Pythonesque के अनुसार, "पायथनस" का अर्थ है "असली, बेतुका", और मुझे नहीं लगता कि आप यही खोज रहे हैं: पी –

+1

प्रश्न संदिग्ध है । क्या उत्तर '2' है क्योंकि' 0.9> 0.7' या '0.8> 0.7'' है? दूसरे शब्दों में, क्या आप अनुक्रमिक रूप से या बढ़ते मूल्यों के क्रम में खोज रहे हैं? – osa

उत्तर

57
next(x[0] for x in enumerate(L) if x[1] > 0.7) 
+17

+1: हालांकि मैं जादू संख्याओं से बचना पसंद करूंगा: अगला (आईडीएक्स के लिए आईडीएक्स, मूल्य में मूल्य (एल) यदि मूल्य> 0.7) – truppo

+22

सादगी के लिए +1 और 'अगला()', लेकिन हो सकता है कि यह पठनीयता के लिए हो: ' अगला (मैं i, v में enumerate (एल) यदि v> 0.7) ' –

+6

हालांकि यह अच्छा लग रहा है, वहीं मामला जहां कोई परिणाम नहीं है, भ्रमित रोकथाम बढ़ाएगा। –

0
>>> f=lambda seq, m: [ii for ii in xrange(0, len(seq)) if seq[ii] > m][0] 
>>> f([.5, .3, .9, .8], 0.7) 
2 
+0

यह बहुत चिकना दिखता है। लेकिन सैद्धांतिक रूप से यह पूरी सूची को पार करेगा और फिर पहला परिणाम (एक्स से बड़ा) वापस करेगा, है ना? क्या पहला परिणाम खोजने के बाद सीधे बंद होने वाला कोई तरीका है? – c00kiemonster

+0

हां, यह सभी सूची – flybywire

+0

पर जाता है जो संपूर्ण सूची को पार करने में क्या गलत है? यदि 0.7 से अधिक का पहला मान सूची के अंत के पास है, तो इससे कोई फर्क नहीं पड़ता है। – ghostdog74

4
for index, elem in enumerate(elements): 
    if elem > reference: 
     return index 
raise ValueError("Nothing Found") 
9
>>> alist= [0.5, 0.3, 0.9, 0.8] 
>>> [ n for n,i in enumerate(alist) if i>0.7 ][0] 
2 
+0

मुझे इसे हराया :) –

+1

यदि' x 'से अधिक है तो यह असफल हो जाएगा सूची में कोई अन्य मूल्य – mshsayem

+1

@mshsayem: इस मामले के लिए समस्या बीमार है। विफलता करने के लिए सही बात हो सकती है। –

11
filter(lambda x: x>.7, seq)[0] 
+1

-1: तकनीकी रूप से सही होने पर, फ़िल्टर का उपयोग न करें जहां एक सूची समझ दोनों अधिक पठनीय और अधिक प्रदर्शनशील – truppo

+0

फ़िल्टर (लैम्ब्डा x: x [1]> .7, एन्यूमेरेट (सीईसी)) [0] [0] - सरल रैखिक पाइथन 3 में – lowtech

+1

@truppo फ़िल्टर खोजें जनरेटर लौटाता है, इसलिए यह सूची समझ से भी बदतर नहीं होना चाहिए? इसके अलावा मुझे इस तरह के समाधान के मुकाबले अधिक पठनीय लगता है। – BubuIIC

11

यदि सूची सॉर्ट हो जाता है तो bisect_left(alist, value) तेजी next(i for i, x in enumerate(alist) if x >= value) की तुलना में एक बड़ी सूची के लिए है।

1

मेरी सूची बहुत लंबी थी जब मुझे एक ही समस्या थी। समझ या फ़िल्टर-आधारित समाधान पूरी सूची के माध्यम से जाना होगा।

from itertools import takewhile 

def f(l, b): return len([x for x in takewhile(lambda x: x[1] <= b, enumerate(l))]) 

l = [0.5, 0.3, 0.9, 0.8] 
f(l, 0.7) 
संबंधित मुद्दे