एक्स से अधिक की सूची में पहली अनुक्रमणिका खोजने के लिए सबसे पाइथोनिक तरीका क्या होगा?एक्स से पहले पाइथन सूची सूचकांक?
उदाहरण के लिए,
list = [0.5, 0.3, 0.9, 0.8]
समारोह के साथ
f(list, 0.7)
वापसी होगी
2.
एक्स से अधिक की सूची में पहली अनुक्रमणिका खोजने के लिए सबसे पाइथोनिक तरीका क्या होगा?एक्स से पहले पाइथन सूची सूचकांक?
उदाहरण के लिए,
list = [0.5, 0.3, 0.9, 0.8]
समारोह के साथ
f(list, 0.7)
वापसी होगी
2.
next(x[0] for x in enumerate(L) if x[1] > 0.7)
+1: हालांकि मैं जादू संख्याओं से बचना पसंद करूंगा: अगला (आईडीएक्स के लिए आईडीएक्स, मूल्य में मूल्य (एल) यदि मूल्य> 0.7) – truppo
सादगी के लिए +1 और 'अगला()', लेकिन हो सकता है कि यह पठनीयता के लिए हो: ' अगला (मैं i, v में enumerate (एल) यदि v> 0.7) ' –
हालांकि यह अच्छा लग रहा है, वहीं मामला जहां कोई परिणाम नहीं है, भ्रमित रोकथाम बढ़ाएगा। –
>>> 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
यह बहुत चिकना दिखता है। लेकिन सैद्धांतिक रूप से यह पूरी सूची को पार करेगा और फिर पहला परिणाम (एक्स से बड़ा) वापस करेगा, है ना? क्या पहला परिणाम खोजने के बाद सीधे बंद होने वाला कोई तरीका है? – c00kiemonster
हां, यह सभी सूची – flybywire
पर जाता है जो संपूर्ण सूची को पार करने में क्या गलत है? यदि 0.7 से अधिक का पहला मान सूची के अंत के पास है, तो इससे कोई फर्क नहीं पड़ता है। – ghostdog74
for index, elem in enumerate(elements):
if elem > reference:
return index
raise ValueError("Nothing Found")
>>> alist= [0.5, 0.3, 0.9, 0.8]
>>> [ n for n,i in enumerate(alist) if i>0.7 ][0]
2
मुझे इसे हराया :) –
यदि' x 'से अधिक है तो यह असफल हो जाएगा सूची में कोई अन्य मूल्य – mshsayem
@mshsayem: इस मामले के लिए समस्या बीमार है। विफलता करने के लिए सही बात हो सकती है। –
एक और एक:
map(lambda x: x>.7, seq).index(True)
filter(lambda x: x>.7, seq)[0]
-1: तकनीकी रूप से सही होने पर, फ़िल्टर का उपयोग न करें जहां एक सूची समझ दोनों अधिक पठनीय और अधिक प्रदर्शनशील – truppo
फ़िल्टर (लैम्ब्डा x: x [1]> .7, एन्यूमेरेट (सीईसी)) [0] [0] - सरल रैखिक पाइथन 3 में – lowtech
@truppo फ़िल्टर खोजें जनरेटर लौटाता है, इसलिए यह सूची समझ से भी बदतर नहीं होना चाहिए? इसके अलावा मुझे इस तरह के समाधान के मुकाबले अधिक पठनीय लगता है। – BubuIIC
यदि सूची सॉर्ट हो जाता है तो bisect_left(alist, value)
तेजी next(i for i, x in enumerate(alist) if x >= value)
की तुलना में एक बड़ी सूची के लिए है।
मेरी सूची बहुत लंबी थी जब मुझे एक ही समस्या थी। समझ या फ़िल्टर-आधारित समाधान पूरी सूची के माध्यम से जाना होगा।
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)
एक चर नाम के रूप में 'सूची' का प्रयोग नहीं करते ... – mshsayem
तुम्हारा मतलब है "pythonic": itertools.takewhile पाश एक बार हालत बन झूठी पहली बार टूट जाएगा। Http://www.urbandictionary.com/define.php?term=Pythonesque के अनुसार, "पायथनस" का अर्थ है "असली, बेतुका", और मुझे नहीं लगता कि आप यही खोज रहे हैं: पी –
प्रश्न संदिग्ध है । क्या उत्तर '2' है क्योंकि' 0.9> 0.7' या '0.8> 0.7'' है? दूसरे शब्दों में, क्या आप अनुक्रमिक रूप से या बढ़ते मूल्यों के क्रम में खोज रहे हैं? – osa