2010-03-09 16 views
10

मुझे पता है कि मैं क्या देख रहा हूं। मैं अजगर मुझे बताने की जो सूची क्या है चाहता हूँपायथन: नेस्टेड सूची में तत्व के लिए इंडेक्सिंग सूची

यहाँ कुछ स्यूडोकोड है:।

item = "a" 

nested_list = [["a", "b"], ["c", "d"]] 

list.index(item) #obviously this doesn't work 
यहाँ

मैं अजगर 0 वापस जाने के लिए (क्योंकि "एक" में पहली उप-सूची में एक तत्व है चाहेगा बड़ी सूची)। मुझे परवाह नहीं है कि यह कौन सा उप-तत्व है। मुझे कोई परवाह नहीं है कि डुप्लिकेट हैं, उदाहरण के लिए, ["ए", "बी", "ए"] उपर्युक्त उदाहरण के समान चीज़ लौटाएंगे।

उत्तर

1

आप किसी प्रकार की पाशन निर्माण का उपयोग करना होगा:

next((sublist for sublist in mainlist if item in sublist)) 

है कि आप आइटम आप चाहते हैं सभी उप-सूचियों के लिए एक जनरेटर दे देंगे, और आप पहले एक दे।

+1

हाँ: इस sublist देता है, जबकि ओ पी निर्दिष्ट वे कहते हैं कि sublist से INDEX चाहते हैं, के रूप में मैं अपने जवाब में लौट आते हैं। –

12

अजगर 2.6 या बेहतर में,

next((i for i, sublist in enumerate(nested_list) if "a" in sublist), -1) 

जैसे यह सोचते हैं आप -1 परिणाम चाहते हैं यदि 'a' किसी भी उपन्यास में मौजूद नहीं है।

बेशक यह पाइथन के पुराने संस्करणों में भी किया जा सकता है, लेकिन काफी आसान नहीं है, और चूंकि आप जो पाइथन संस्करणों में रुचि रखते हैं, उन्हें निर्दिष्ट नहीं करते हैं, मुझे लगता है कि नवीनतम उत्पादन का उपयोग करना सबसे अच्छा है- ठोस एक (यदि आपको पाइथन के अन्य पुराने संस्करणों को निर्दिष्ट करने की आवश्यकता है तो बस अपना उत्तर संपादित करें)।

संपादित करें: प्रति अनुरोध, मुझे यह बताने की कोशिश करें कि यह कैसे काम करता है। मैं (2.6 में नया) अंतर्निर्मित फ़ंक्शन next का उपयोग कर रहा हूं, विशेष रूप से मैं next(iterator, default) पर कॉल कर रहा हूं: इटरेटर का अगला आइटम लौटाता है (और इस प्रकार पहला, क्योंकि यह पहली बार है जब हम उस इटरेटर को आगे बढ़ा रहे हैं), या डिफ़ॉल्ट मान अगर इटरेटर समाप्त हो गया है (जिसका अर्थ है "खाली" अगर यह कभी भी इसे उन्नत करने से पहले समाप्त हो जाता है ;-)। डिफ़ॉल्ट रूप से स्पष्ट है कि -1 और "a किसी भी उपन्यास में मौजूद नहीं है", जिसका अर्थ है कि इस मामले में "इटेटरेटर खाली है" जैसा ही है। फिर इटरेटर पर

आइए नज़र:

(i for i, sublist in enumerate(nested_list) if "a" in sublist) 

(गोल) कोष्ठकों और for और if कीवर्ड इसका मतलब यह एक जनरेटर अभिव्यक्ति, यह भी genexp के रूप में संक्षिप्तता के लिए जाना जाता है। i (सूचकांक) और sublist (उस सूचकांक पर आइटम) enumerate(nested_list) से अधिक अग्रिम - अगर हमारे पास enumerate नहीं था तो हम सूचकांक का ट्रैक नहीं रखेंगे, लेकिन इस मामले में हमें इसकी आवश्यकता है। उन्हें केवल तभी माना जाता है जब if खंड संतुष्ट होता है, यानी, जब आप जिस तत्व को खोज रहे हैं वह वर्तमान उपन्यास में मौजूद है।

तो यह जीनएक्सपी एक समय में, सूचकांक के प्रत्येक मूल्य का उत्पादन करता है जैसे कि उस सूचकांक में उपन्यास "a" in sublist स्थिति को संतुष्ट करता है। चूंकि हम इसे next के अंदर उपयोग कर रहे हैं, हम केवल पहली ऐसी अनुक्रमणिका लेते हैं।

ओपी को यह सोचने के लिए उचित ठहराया जा सकता है कि तीन या चार वर्णों में यह सब एक जादुई बिल्टिन काम करेगा - और इसलिए, यह बहुत विशिष्ट आवश्यकता के लिए होगा, जो मुझे विश्वास है कि मैं पहले कभी नहीं मिला पाइथन के उपयोग के दस वर्षों से अधिक; हालांकि, अगर इस तरह की प्रत्येक विशिष्ट आवश्यकता के पास अपनी खुद की विशिष्ट विशिष्टता थी तो भाषा और बिल्टिन टैक्स कोड से बड़े होंगे।इसके बजाए, पाइथन कई निचले स्तर के "लेगो ईंटों" और स्पष्ट रूप से (और उचित रूप से संक्षेप में) को एक साथ स्नैप करने के लिए कुछ आसान तरीका प्रदान करता है, जो कि ओपी की तरह विशिष्ट आवश्यकताओं की एक संयोजन-विविध विविधता के समाधान को व्यक्त करता है।

+1

चूंकि वह प्रोग्रामिंग के लिए नया है, तो क्या आप यह समझाने के लिए बहुत दयालु होंगे कि यह कैसे काम करता है? :) हालांकि, आपका +1 वैसे भी है। –

+0

@musicfreak, निश्चित रूप से, मुझे कुछ स्पष्टीकरण जोड़ने दें। –

+0

वाह, महान स्पष्टीकरण! अगर मैं कर सकता तो मैं आपको और वोट दूंगा! –

0

प्रत्येक उपन्यास प्राप्त करने के लिए सूची में Iterate। तो फिर, अगर आइटम sublist में है देखने के लिए जाँच:

for i in range(0,len(list)): 
    if whatYoureLookingFor in list[i]: 
     print i 
0
>>> nested_list = [["a", "b"], ["c", "d"]] 
>>> item="a" 
>>> for o,sublist in enumerate(nested_list): 
...  if item in sublist: 
...   print o 
... 
0 
संबंधित मुद्दे