2012-03-26 18 views
205

किसी निश्चित मानदंड से मेल खाने वाली पहली सूची आइटम को ढूंढने/वापस करने का सबसे सुरुचिपूर्ण और प्रभावी तरीका क्या होगा?पहला अनुक्रम आइटम ढूंढें जो मानदंड से मेल खाता है

उदाहरण के लिए, यदि मेरे पास ऑब्जेक्ट्स की एक सूची है और मैं विशेषता obj.val==5 विशेषता वाले लोगों का पहला ऑब्जेक्ट प्राप्त करना चाहता हूं। मैं निश्चित रूप से सूची समझ का उपयोग कर सकता हूं, लेकिन यह ओ (एन) होगा और यदि एन बड़ा है, तो यह अपमानजनक है। एक बार मानदंड मिलने के बाद मैं break के साथ एक लूप का भी उपयोग कर सकता था, लेकिन मैंने सोचा कि एक और पाइथोनिक/सुरुचिपूर्ण समाधान हो सकता है।

+2

क्या आप आइटम और सूचकांक प्राप्त करना चाहते हैं तो क्या होगा? –

+1

@CharlieParker, इंडेक्स और आइटम दोनों प्राप्त करने के लिए, आईडीएक्स के लिए अगली ((idx, obj) का उपयोग करें, obj.val == 5) –

उत्तर

367

आप किसी भी अन्य अनुक्रमित करने या अपने वस्तुओं के लिए हल कर जानकारी नहीं है, तो आप जब तक इस तरह के एक वस्तु पाया जाता है पुनरावृति करना होगा:

next(obj for obj in objs if obj.val==5) 

हालांकि यह तेजी से एक पूरी सूची के समझ से है। इन दोनों की तुलना करें:

[i for i in xrange(100000) if i == 1000][0] 

next(i for i in xrange(100000) if i == 1000) 

पहले एक 5.75ms की जरूरत है, दूसरा एक 58.3μs (100 गुना तेजी से क्योंकि पाश 100 गुना कम)।

+93

'अगला' भी ' डिफ़ॉल्ट 'तर्क, इस मामले में कि कोई वस्तु मौजूद नहीं है। जैसे 'अगला ((मैं रेंज में (500) यदि i> 600), 600) '600 वापस आ जाएगा। – Darthfett

+22

पायथन [**' अगला() '**] (http://docs.python.org/2 /library/functions.html#next) –

+5

ठीक है, यह है, लेकिन मुझे बस कूलर देखने का सही उत्तर होने की उम्मीद है। हम हमेशा इतना सुरुचिपूर्ण होने के लिए अजगर का विज्ञापन करते हैं। यदि आप इसे मजबूत बनाना चाहते हैं, तो आपको 'डिफ़ॉल्ट' (उदाहरण के लिए 'कोई नहीं') प्रदान करना चाहिए - और फिर आपको यह नहीं भूलना चाहिए कि 'जेनरेटर अभिव्यक्ति को एकमात्र तर्क नहीं होने पर ब्रांडेड किया जाना चाहिए' ... अच्छा, यह पठनीयता को कैसे प्रभावित करता है ? जैसे पहला गैर-पथ औषधि: 'अगला ((sysargv में तर्क के लिए तर्क अगर os.path.exists (arg) नहीं है), कोई नहीं) '- बहुत दोस्ताना नहीं है। –

2
a=[100,200,300,400,500] 
def search(b): 
try: 
    k=a.index(b) 
    return a[k] 
except ValueError: 
    return 'not found' 
print(search(500)) 

यह वस्तु वापस आ जाएंगे, यदि किसी और पाया इसे वापस "नहीं मिला" करेंगे

+0

यह अच्छा है, लेकिन केवल तभी काम करता है जब मानदंड सूची आइटम की तुलना में होता है। मैं – Jonathan

+0

चयन के व्यापक दायरे को संभालने के लिए एक और सामान्य समाधान की तलाश में था, लेकिन आपके प्रश्न में @ जोनाथन ने आपको पहली सूची आइटम ** वापस करने का प्रभावी तरीका बताया ** इसलिए उपरोक्त सूची में एक = [100,200,300,400,500] कोई भी हो सकता है ऑब्जेक्ट का प्रकार सिर्फ संख्या नहीं। –

+1

और मैंने "... जो एक निश्चित मानदंड से मेल खाता है" के साथ वाक्य का निष्कर्ष निकाला है, जो समानता या पहचान से मेल खाने जैसा नहीं है :) मैंने +1 किया क्योंकि मुझे लगता है कि आपका समाधान समानता \ पहचान निजी मामले के लिए अच्छा है – Jonathan

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