सूची में आइटम की स्थिति कैसे प्राप्त करें?


169

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

उदाहरण:

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

जवाबों:


280

हममम। यहाँ एक सूची समझ के साथ एक उत्तर था, लेकिन यह गायब हो गया है।

यहाँ:

 [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

और पर्याप्त रूप से, हम इसे एक चर में निर्दिष्ट कर सकते हैं, और वहां से इसका उपयोग कर सकते हैं ...

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

और सोचने के लिए मैं फोरट्रान लिखता था।


6
कार्यात्मक प्रोग्रामिंग पर शायद 25 साल तक सवाल करने के बाद, मुझे लगता है कि मुझे आखिरकार सुराग मिल रहा है। सूची समझ दा बम है।
चार्ली मार्टिन

15
मुझे लगता है कि आप "एकल पत्र" का मतलब है और स्पष्ट रूप से, इस उदाहरण में एक लंबा नाम कोई और अधिक जानकारी सामग्री होगी।
चार्ली मार्टिन

2
महान जवाब के लिए धन्यवाद। मुझे लगता है कि @ नेलर की टिप्पणी इस तथ्य से संबंधित हो सकती है कि आप जनरेटर उदाहरण में एक पंक्ति में दो अलग-अलग संदर्भों में 'i' का उपयोग करते हैं; एक समझ के अंदर, और दूसरा इसके माध्यम से पुनरावृति करने के लिए। मुझे पता है कि यह मुझे एक दूसरे के लिए फेंक दिया।
ब्राउन

1
@CharlieMartin आप सिंगल कैरेक्टर वैरिएबल के लिए एक कॉमन कन्वेंशन के आइटम के बजाय इंडेक्स के लिए 'i' का इस्तेमाल करते हैं। सूचकांक 'इंडेक्स' और 'आइटम' नामकरण से अस्पष्टता दूर होगी। इसके अतिरिक्त आप एक ऐसे माता-पिता को जवाब दे रहे हैं, जो 'आइटम' और 'पोज़िशन' का इस्तेमाल करता है और यह अच्छा है कि आपके उत्तर में मूल कोड के कुछ हिस्सों का अनावश्यक रूप से नाम नहीं बदला जाए।
मिकमेकसाना

1
सुपर सिंटैक्स: ओ) आप आसानी से एक कमांड लाइन पैरामीटर प्राप्त कर सकते हैं। चलो तर्क की एक सरणी है args = ['x', '-p1', 'v1', '-p2', 'v2']:। फिर कमांड args[[i for i, x in enumerate(args) if x == '-p1'][0] + 1]वापस आती है'v1'
थियोडोर कींस्टीन

170

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

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

5
एक्सेस करने से पहले परीक्षण के बजाय, आप भी बस कोशिश करते हैं और के लिए जांच कर सकता हैValueError
kratenko

मुझे लगता है कि वह सभी घटनाओं को ढूंढना चाहता है, आप केवल पहले वाले को देते हैं।
tfv

@tfv मैं यह नहीं देखता कि आप इस तरह के निष्कर्ष पर कैसे आ सकते हैं क्योंकि सवाल "आइटम" और "आइटम" नहीं है।
एमएमजेड

40

गणना का उपयोग करें:

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

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

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


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

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

2
अपडेट: xrangeपायथन 3.x में अपदस्थ है, क्योंकि नया rangeपुराना हैxrange
टिम-ओह

5

यहाँ यह करने का एक और तरीका है:

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



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

यदि आप मूल्य को बहुत अधिक पाने की उम्मीद करते हैं, तो आपको संभवतः एक सूची में "सूचकांक" जोड़ना चाहिए और प्रति पुनरावृत्ति का समय बचाने के लिए सूची को अंत में प्रिंट करना चाहिए।


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

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

0

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

from Tkinter import * 
listbox.curselection()

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

यह इस तरह एक स्थिति लौटेगा:

('0'), (हालांकि बाद में टिंकेटर के संस्करण इसके बजाय एक किलों की सूची लौटा सकते हैं)

जो पहली स्थिति के लिए है और आइटम स्थिति के अनुसार संख्या बदल जाएगी।

अधिक जानकारी के लिए, यह पृष्ठ देखें: http://effbot.org/tkinterbook/listbox.htm

अभिवादन।


1
दिलचस्प विचार। चूँकि इसके लिए पूरे टिंकर लाइब्रेरी को आयात करने की आवश्यकता होती है, हालाँकि, यह समस्या को हल करने का सबसे कारगर तरीका नहीं है।
सीयोटनटर्नड

3
यह एक ऐसा अकुशल और भ्रामक रास्ता है कि मैं कहूंगा कि यह एक गलत जवाब है, भले ही यह कुछ हद तक सवाल का जवाब दे।

इस जवाब का सवाल से कोई लेना-देना नहीं है।
कोडी पियर्सल

0

क्यों उलझी बातें?

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

0

जिस के साथ पूरा उदाहरण बताना input_listहै searies1(उदाहरण: input_list [0]) जिसमें आप एक लुकअप करना चाहते हैंseries2 (उदाहरण: input_list [1]) और अगर यह SERIES1 में मौजूद है SERIES2 के अनुक्रमित मिलता है।

नोट: certain conditionयदि स्थिति सरल है तो आप लंबोदर अभिव्यक्ति में जाएंगे

input_list = [[1,2,3,4,5,6,7],[1,3,7]]
series1 = input_list[0]
series2 = input_list[1]
idx_list = list(map(lambda item: series1.index(item) if item in series1 else None, series2))
print(idx_list)

उत्पादन:

[0, 2, 6]

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.