2008-12-13 19 views
130

मैं एक सूची में पुन: प्रयास कर रहा हूं और यदि मैं किसी निश्चित स्थिति को पूरा करता हूं तो मैं आइटम की अनुक्रमणिका मुद्रित करना चाहता हूं। यह मैं कैसे करूंगा?सूची में आइटम की स्थिति कैसे प्राप्त करें?

उदाहरण:

testlist = [1,2,3,5,3,1,2,1,6] 
for item in testlist: 
    if item == 1: 
     print position 

उत्तर

222

हमम। यहां एक सूची समझ के साथ एक जवाब था, लेकिन यह गायब हो गया है।

यहाँ:

[i for i,x in enumerate(testlist) if x == 1] 

उदाहरण:

>>> testlist 
[1, 2, 3, 5, 3, 1, 2, 1, 6] 
>>> [i for i,x in enumerate(testlist) if x == 1] 
[0, 5, 7] 

अद्यतन:

ठीक है, यदि आप एक जनरेटर अभिव्यक्ति चाहते हैं, हम एक जनरेटर अभिव्यक्ति होगा। यहाँ सूची समझ फिर, एक में पाश के लिए है:

>>> for i in [i for i,x in enumerate(testlist) if x == 1]: 
...  print i 
... 
0 
5 
7 

अब हम एक जनरेटर का निर्माण होगा ...

>>> (i for i,x in enumerate(testlist) if x == 1) 
<generator object at 0x6b508> 
>>> for i in (i for i,x in enumerate(testlist) if x == 1): 
...  print i 
... 
0 
5 
7 

और niftily पर्याप्त है, हम एक चर है कि प्रदान कर सकते हैं, और इसका इस्तेमाल करते हैं वहाँ से ...

>>> gen = (i for i,x in enumerate(testlist) if x == 1) 
>>> for i in gen: print i 
... 
0 
5 
7 

और मैं FORTRAN लिखने के लिए प्रयोग किया जाता है सोचने के लिए।

+0

यह आईएमओ का सबसे अच्छा जवाब है। यह स्पष्ट और संक्षेप में है, और आप वास्तव में सूचकांक मानों को कैप्चर करते हैं, इसलिए यह एक्स्टेंसिबल है (आप उन्हें प्रिंट कर सकते हैं, उन्हें किसी अन्य func पर भेज सकते हैं।) इत्यादि। केवल कई मैचों के मामलों के लिए जनरेटर अभिव्यक्ति का उपयोग करना है। http://is.gd/brzl – gotgenes

+5

संभवतया 25 साल की पूछताछ प्रोग्रामिंग प्रोग्रामिंग के बाद, मुझे लगता है कि मुझे अंत में सुराग मिल रहा है। सूची समझ डा बम है। –

+0

एकल शब्द चर आपके कोड को समझना कठिन बनाते हैं, खासकर प्रोग्रामिंग उदाहरणों में। – mikemaccana

10
for i in xrange(len(testlist)): 
    if testlist[i] == 1: 
    print i 

बजाय xrange रेंज का अनुरोध किया के रूप में (टिप्पणी देखें)।

+0

xrange() - श्रेणी() के साथ रेंज() को प्रतिस्थापित करता है, एक सूची बनाता है, xrange() एक इटरेटर बनाता है। xrange() waaayay कम स्मृति का उपयोग करता है, और inital कॉल तेज है। – gnud

+2

मैं अजगर 2 कार्यक्रमों में बड़ी सूचियों के लिए सहमत हूं। ध्यान दें कि 'रेंज' अभी भी अजगर 3 में काम करेगी (और xrange आईआईआरसी की तरह काम करें)। 'xrange' डायनासोर के रास्ते जा रहा है। – jakber

+0

अपडेट: 'xrange' को पायथन 3.x में हटा दिया गया है, क्योंकि नई 'रेंज' पुरानी' xrange' –

39

उपयोग की गणना:

testlist = [1,2,3,5,3,1,2,1,6] 
for position, item in enumerate(testlist): 
    if item == 1: 
     print position 
1

यदि आपकी सूची काफी बड़ी है और आप केवल सूचकांकों की एक विरल संख्या में मूल्य खोजने के विचार है कि यह कोड तेजी से ज्यादा अमल कर सके क्योंकि आपने क्या करने की उम्मीद सूची में हर मूल्य को फिर से शुरू करना होगा।

lookingFor = 1 
i = 0 
index = 0 
try: 
    while i < len(testlist): 
    index = testlist.index(lookingFor,i) 
    i = index + 1 
    print index 
except ValueError: #testlist.index() cannot find lookingFor 
    pass 

आप मूल्य एक बहुत आप शायद सिर्फ एक सूची में "अनुक्रमणिका" संलग्न करना होगा और यात्रा प्रति समय बचाने के लिए अंत में सूची प्रिंट पाने की उम्मीद है।

+0

है मैंने कुछ समय परीक्षण किए हैं। सूची समझ तकनीक इस कोड से 38% तेज है। (मैंने आपके प्रिंट स्टेटमेंट को outputlist.append कॉल के साथ बदल दिया है) – Deestan

+0

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

-2
testlist = [1,2,3,5,3,1,2,1,6] 
for id, value in enumerate(testlist): 
    if id == 1: 
     print testlist[id] 

मुझे लगता है कि यह बेहद सटीक है जो आप चाहते हैं। ;-) 'आईडी' हमेशा सूची में मूल्यों का सूचकांक होगा।

try: 
    id = testlist.index('1') 
    print testlist[id] 
except: 
    print "Not Found" 
3

यहाँ एक और तरीका यह करने के लिए है?

print testlist.index(element) 

आप सूची में वास्तव में है देखने के लिए कि क्या तत्व में सुनिश्चित नहीं हैं, तो आप एक प्राथमिक जांच, जैसे

if element in testlist: 
    print testlist.index(element) 

या

print(testlist.index(element) if element in testlist else None) 

या जोड़ सकते हैं " पायथनिक तरीका ", जो मुझे बहुत पसंद नहीं है क्योंकि कोड कम स्पष्ट है, लेकिन कभी-कभी अधिक कुशल होता है,

try: 
    print testlist.index(element) 
except ValueError: 
    pass 
111

क्या निम्नलिखित के बारे में:

+5

एक्सेस करने से पहले परीक्षण करने के बजाय, आप बस 'ValueError' – kratenko

+0

के लिए प्रयास करें और जांचें मुझे लगता है कि वह सभी घटनाओं को ढूंढना चाहता है, आपको लगता है कि केवल पहला ही है। – tfv

+0

@tfv मुझे नहीं लगता कि आप इस तरह के निष्कर्ष पर कैसे आ सकते हैं क्योंकि प्रश्न "आइटम" और "आइटम" नहीं कहता है। – mmj

0

मुझे लगता है कि यह thte Tkinter पुस्तकालय से curselection() विधि का उपयोग करने के लिए उपयोगी हो सकता है:

from Tkinter import * 
listbox.curselection() 

इस विधि Tkinter लिस्टबॉक्स विजेट पर काम करता है तो आप उनमें से एक का निर्माण करने की आवश्यकता होगी एक सूची के बजाय।

यह इस तरह की स्थिति वापस आ जाएगी:

('0',)

कौन सा पहले की स्थिति और के लिए है (हालांकि Tkinter के बाद के संस्करणों एक ints के बजाय सूची वापस आ सकते हैं) आइटम की स्थिति के अनुसार संख्या बदल जाएगी। http://effbot.org/tkinterbook/listbox.htm

अभिवादन:

अधिक जानकारी के लिए यह पृष्ठ देखें।

+0

दिलचस्प विचार। चूंकि इसे पूरे टिंकर लाइब्रेरी को आयात करने की आवश्यकता है, हालांकि, समस्या को हल करने का यह सबसे प्रभावी तरीका नहीं है। – seaotternerd

+2

यह ऐसा अक्षम और घूमने वाला पथ है जो मैं कहूंगा कि यह एक गलत जवाब है, भले ही यह कुछ हद तक प्रश्न को संबोधित करता हो। –

+0

इस उत्तर के पास इस प्रश्न के साथ कुछ लेना देना नहीं है। –

0

चीजों को जटिल क्यों करें?

testlist = [1,2,3,5,3,1,2,1,6] 
for position, item in enumerate(testlist): 
    if item == 1: 
     print position 
संबंधित मुद्दे