2010-04-30 7 views
16

पायथन की सूची प्रकार में एक अनुक्रमणिका (x) विधि है। यह एक पैरामीटर x लेता है, और उस सूची में पहले आइटम की (पूर्णांक) अनुक्रमणिका देता है जिसमें मान x है।पायथन में, मैं सूची में पहले आइटम की अनुक्रमणिका कैसे ढूंढ सकता हूं जो कुछ मूल्य नहीं है?

असल में, मुझे इंडेक्स (x) विधि को उलटा करने की आवश्यकता है। मुझे उस सूची में पहले मान की अनुक्रमणिका प्राप्त करने की आवश्यकता है जिसमें मान x नहीं है। मैं शायद एक ऐसे फ़ंक्शन का उपयोग करने में भी सक्षम हूं जो किसी आइटम के साथ पहले आइटम की अनुक्रमणिका देता है! = कोई नहीं।

मैं एक वृद्धिशील काउंटर वैरिएबल के साथ 'फॉर' लूप कार्यान्वयन के बारे में सोच सकता हूं, लेकिन मुझे लगता है कि मुझे कुछ याद आ रही है। क्या कोई मौजूदा विधि है, या एक लाइन पायथन निर्माण जो इसे संभाल सकता है?

मेरे कार्यक्रम में, जब मैं जटिल रेगेक्स मैचों से लौटाई गई सूचियों को संभालने में स्थिति आती हूं तो स्थिति आती है। प्रत्येक सूची में एक आइटम के अलावा सभी का कोई मूल्य नहीं है। अगर मुझे मिलान की गई स्ट्रिंग की आवश्यकता है, तो मैं एक सूची समझ का उपयोग कर सकता हूं जैसे '[x x में [my_list] यदि x कोई नहीं है]', लेकिन मुझे यह पता लगाने के लिए इंडेक्स की आवश्यकता है कि मेरे रेगेक्स में कौन सा कैप्चर समूह वास्तव में हुआ मैच।

+0

क्या आप वाकई इंडेक्स की आवश्यकता है और वास्तविक मूल्य नहीं? –

+0

एक सूची समझ मूल रूप से लूप के समान ही है, लेकिन एक अलग तरीके से लिखा गया है (जो अक्सर पढ़ने के लिए कठिन हो सकता है)।मैं केवल लूप के लिए उपयोग करने की अनुशंसा करता हूं (गणना के साथ) – mathmike

उत्तर

18

पहले मैच में बाहर निकल रहा है सब के सब यह लाभ केवल लेने के लिए वास्तव में आसान है: कंप्यूटिंग के बजाय एक पूर्ण सूची समझ (फिर पहले आइटम को छोड़कर सब कुछ फेंकना), एक जीनएक्सपी पर next का उपयोग करें। उदाहरण है कि आप चाहते हैं -1 जब कोई आइटम != x जा रहा है की शर्त को संतुष्ट करता है के लिए मान लिया जाये,

return next((i for i, v in enumerate(L) if v != x), -1) 

यह अजगर 2.6 वाक्य रचना है, आप 2.5 के साथ फंस अगर कर रहे हैं या पहले .next() genexp (या अन्य इटरेटर) की एक विधि है और इसके बाद के संस्करण (इसलिए यदि आप एक StopIteration अपवाद आप करेंगे देखने के लिए नहीं करना चाहती -1 की तरह एक डिफ़ॉल्ट मान स्वीकार नहीं करता है try/except का उपयोग करना होगा)। लेकिन फिर, है क्योंकि 2.5 के बाद और अधिक रिलीज किए गए थे - भाषा और इसके अंतर्निर्मित सुधारों में निरंतर सुधार! -

+0

मुझे वास्तव में "कोई आइटम संतुष्ट" स्थिति को संभालने की आवश्यकता नहीं है, क्योंकि रेगेक्स विधि हमेशा कम से कम एक गैर-कोई भी सूची आइटम नहीं लौटाती है। तो मुझे लगता है कि यह काम करना चाहिए: अगला (मैं i, x में enumerate (my_list,) अगर x कोई नहीं है)। डीबगर के तहत, ऐसा लगता है कि पहले मैच में रुकना है, इसलिए मुझे बेचा गया है। कूल चाल –

+0

@Ryan, हाँ, अगर आपको डिफ़ॉल्ट परिणाम की आवश्यकता नहीं है, तो सभी आइटम कोई नहीं हैं, तो आपकी सरल अभिव्यक्ति ठीक काम करेगी। –

4

enumerate() एक पुनरावर्तक लौटाता है जो पुन: प्रयोज्य और साथ ही आइटम की वर्तमान अनुक्रमणिका का एक टुपल उत्पन्न करता है।

+1

अरे, मैं वास्तव में कुछ खो रहा था। हाँ, सटीक उपयोग इस तरह कुछ है: [i i i, x in enumerate (my_list) यदि x कोई नहीं है]। धन्यवाद! –

1
[i for i, x in enumerate(my_list) if x != value][0] 

आप यकीन है कि एक न खाने वाले आइटम है कि क्या वहाँ नहीं कर रहे हैं, इस के बजाय का उपयोग करें:

match = [i for i, x in enumerate(my_list) if x != value] 
if match: 
    i = match[0] 
    # i is your number. 

आप इस और भी अधिक itertools के साथ "कार्यात्मक" कर सकते हैं, लेकिन आप जल्दी ही पहुंच जाएगा बिंदु जहां लूप के लिए एक सरल बेहतर है। यहां तक ​​कि उपर्युक्त समाधान लूप के रूप में उतने कुशल नहीं हैं, क्योंकि वे रुचि के एक खींचने से पहले सभी गैर-मिलान सूचकांक की एक सूची बनाते हैं।

5

एक सूची समझ का उपयोग करते हुए जब आपको केवल पहले की आवश्यकता होती है तो मुझे पतला लगता है (मेरे लिए)। फॉर-लूप का उपयोग करें और जल्दी से बाहर निकलें।

>>> lst = [None, None, None, "foo", None] 
>>> for i, item in enumerate(lst): 
... if item: break 
... else: 
... print "not found" 
... 
>>> i 
3 
+0

क्या आपने मेरे मूल प्रश्न में तीसरा अनुच्छेद पढ़ा था? लूप कार्यान्वयन के लिए मामूली है। मैं विशेष रूप से एक लाइनर या मौजूदा विधि की तलाश में था। (वोटों के आधार पर, ऐसा लगता है कि आप एकमात्र व्यक्ति नहीं थे जो इस बिंदु को चूक गए थे। मुझे इसे थोड़ा और स्पष्ट बनाना चाहिए था।) –

+0

@ रयान बी लिंच: मैंने इसे पढ़ा था। आपने बताया कि आप इसे फॉर-लूप और काउंटर का उपयोग करके कर सकते हैं ... जो अधिक कोड और थोड़ा बदसूरत है। काउंटर को स्वचालित रूप से प्राप्त करने के लिए मैंने गणना() का उपयोग किया। आपके प्रश्न से, मुझे यकीन नहीं था कि क्या आप जानते थे कि संख्याएं मौजूद थीं। ओटीओएच, मुझे अगले() अस्तित्व में नहीं पता था (लेकिन मैंने पाइथन 2.5 का उपयोग किया), इसलिए मैंने एलेक्स के समाधान से कुछ सीखा। मुझे पता नहीं क्यों लोगों ने इसके लिए वोट दिया, शायद वोट एक-पंक्ति में कुछ करने की कोशिश करने से आए थे जो दो में छोटे और पारदर्शी रूप से किया जा सकता है? – Stephen

+0

काउंटर बनाम ब्रेक चीज़ के बारे में अच्छा बिंदु। "एक पंक्ति में कुछ करने की कोशिश करने के बारे में राय के रूप में जो दो में छोटे और पारदर्शी रूप से किया जा सकता है", आपके मूल उत्तर ने इसे स्पष्ट रूप से बताया। लेकिन यदि कोडिंग विचारों को कोडिंग आपकी प्रतिक्रिया को प्रेरित कर रही है, तो इसका उत्तर क्यों दें? क्या यह टिप्पणी नहीं है? –

0

एक मूर्खतापूर्ण itertools आधारित समाधान :)

import itertools as it, operator as op, functools as ft 

def index_ne(item, sequence): 
    sequence= iter(sequence) 
    counter= it.count(-1) # start counting at -1 
    pairs= it.izip(sequence, counter) # pair them 
    get_1st= it.imap(op.itemgetter(0), pairs) # drop the used counter value 
    ne_scanner= it.ifilter(ft.partial(op.ne, item), get_1st) # get only not-equals 
    try: 
     ne_scanner.next() # this should be the first not equal 
    except StopIteration: 
     return None # or raise some exception, all items equal to item 
    else: 
     return counter.next() # should be the index of the not-equal item 

if __name__ == "__main__": 
    import random 

    test_data= [0]*20 
    print "failure", index_ne(0, test_data) 

    index= random.randrange(len(test_data)) 
    test_data[index]= 1 
    print "success:", index_ne(0, test_data), "should be", index 

itertools.count गिनती :)

+0

ध्यान दें कि कुछ मौकों पर, ऊपर 'ft.partial (op.ne, item) 'डिवाइस के बजाय' item .__ ne__' का उपयोग किया जा सकता है; हालांकि, उत्तरार्द्ध सभी 'आइटम' के साथ काम करता है। – tzot

+4

यह प्रभावशाली रूप से समझ में नहीं आता है। –

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

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