एक सूची ["foo", "bar", "baz"]
और सूची में एक आइटम "bar"
को देखते हुए, मैं पायथन में इसकी अनुक्रमणिका (1
) कैसे प्राप्त करूं?
32 जवाब
>>> ["foo", "bar", "baz"].index("bar")
1
संदर्भ: डेटा संरचनाएं > सूचियों पर अधिक
चेतावनी का पालन करें
ध्यान दें कि जैसा पूछा गया प्रश्न का उत्तर देने का यह शायद सबसे साफ तरीका है, index
list
API का एक कमजोर घटक है, और मुझे अंतिम याद नहीं है समय मैंने इसे गुस्से में इस्तेमाल किया। टिप्पणियों में मुझे यह बताया गया है कि क्योंकि यह उत्तर भारी संदर्भित है, इसे और अधिक पूर्ण बनाया जाना चाहिए। list.index
के बारे में कुछ चेतावनियां अनुसरण करती हैं। संभवतः इसके लिए दस्तावेज़ीकरण पर एक नज़र डालने लायक है:
list.index(x[, start[, end]])
पहले आइटम की सूची में शून्य-आधारित अनुक्रमणिका लौटाएं जिसका मान x के बराबर है। अगर ऐसा कोई आइटम नहीं है, तो
ValueError
उठाता है।वैकल्पिक तर्क प्रारंभ और अंत की व्याख्या स्लाइस नोटेशन और खोज को सूची के किसी विशेष अनुवर्ती तक सीमित करने के लिए उपयोग किया जाता है। लौटाए गए सूचकांक की गणना प्रारंभ तर्क के बजाय पूर्ण अनुक्रम की शुरुआत के सापेक्ष की जाती है।
सूची की लंबाई में रैखिक समय-जटिलता
एक index
कॉल सूची के प्रत्येक तत्व को क्रम से जांचता है, जब तक कि उसे एक मैच नहीं मिल जाता। यदि आपकी सूची लंबी है, और आप मोटे तौर पर यह नहीं जानते कि सूची में यह कहां है, तो यह खोज एक अड़चन बन सकती है। उस स्थिति में, आपको एक भिन्न डेटा संरचना पर विचार करना चाहिए। ध्यान दें कि यदि आप मोटे तौर पर जानते हैं कि मैच को कहां खोजना है, तो आप index
एक संकेत दे सकते हैं। उदाहरण के लिए, इस स्निपेट में, l.index(999_999, 999_990, 1_000_000)
, सीधे l.index(999_999)
की तुलना में परिमाण के मोटे तौर पर पांच क्रम तेज हैं, क्योंकि पहले वाले को केवल 10 प्रविष्टियां खोजनी होती हैं, जबकि बाद वाले को एक मिलियन खोज करनी होती है:
>>> import timeit
>>> timeit.timeit('l.index(999_999)', setup='l = list(range(0, 1_000_000))', number=1000)
9.356267921015387
>>> timeit.timeit('l.index(999_999, 999_990, 1_000_000)', setup='l = list(range(0, 1_000_000))', number=1000)
0.0004404920036904514
केवल पहले मैच की अनुक्रमणिका को उसके तर्क पर लौटाता है
index
के लिए एक कॉल सूची में तब तक खोज करती है जब तक कि उसे कोई मिलान नहीं मिल जाता, और वहां रुक जाता है। यदि आप अधिक मैचों के सूचकांक की आवश्यकता की अपेक्षा करते हैं, तो आपको सूची समझ, या जनरेटर का उपयोग करना चाहिए। अभिव्यक्ति।
>>> [1, 1].index(1)
0
>>> [i for i, e in enumerate([1, 2, 1]) if e == 1]
[0, 2]
>>> g = (i for i, e in enumerate([1, 2, 1]) if e == 1)
>>> next(g)
0
>>> next(g)
2
अधिकांश स्थानों पर जहां मैंने एक बार index
का उपयोग किया होगा, अब मैं एक सूची समझ या जनरेटर अभिव्यक्ति का उपयोग करता हूं क्योंकि वे अधिक सामान्य हैं। इसलिए यदि आप index
तक पहुंचने पर विचार कर रहे हैं, तो इन उत्कृष्ट पायथन विशेषताओं पर एक नज़र डालें।
यदि तत्व सूची में मौजूद नहीं है तो फेंकता है
index
पर कॉल करने पर ValueError
मिलता है। आइटम मौजूद नहीं है।
>>> [1, 1].index(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 2 is not in list
यदि आइटम सूची में मौजूद नहीं हो सकता है, तो आपको या तो करना चाहिए
- पहले
item in my_list
(स्वच्छ, पठनीय दृष्टिकोण), या . के साथ इसकी जांच करें index
कॉल कोtry/except
ब्लॉक में लपेटें, जोValueError
को पकड़ता है (शायद तेज़, कम से कम जब खोज करने के लिए सूची लंबी हो, और आइटम आमतौर पर मौजूद हो।)
index()
पूर्णांकों की सूचियों की तुलना में सूची बोध की तुलना में 90% से कम तेज़ है।
एक चीज जो वास्तव में पायथन सीखने में मददगार है, वह है इंटरएक्टिव हेल्प फंक्शन का उपयोग करना:
>>> help(["foo", "bar", "baz"])
Help on list object:
class list(object)
...
|
| index(...)
| L.index(value, [start, [stop]]) -> integer -- return first index of value
|
जो अक्सर आपको उस विधि तक ले जाएगा जिसकी आप तलाश कर रहे हैं।
अधिकांश उत्तर समझाते हैं कि एक एकल अनुक्रमणिका को कैसे खोजा जाए, लेकिन यदि आइटम कई बार सूची में है तो उनके तरीके एकाधिक अनुक्रमणिका नहीं लौटाते हैं। enumerate()
का उपयोग करें:
for i, j in enumerate(['foo', 'bar', 'baz']):
if j == 'bar':
print(i)
index()
फ़ंक्शन केवल पहली घटना देता है, जबकि enumerate()
सभी आवृत्तियां देता है।
सूची समझ के रूप में:
[i for i, j in enumerate(['foo', 'bar', 'baz']) if j == 'bar']
यहां itertools.count()
के साथ एक और छोटा समाधान भी दिया गया है (जो सुंदर है गणना के समान ही दृष्टिकोण):
from itertools import izip as zip, count # izip for maximum efficiency
[i for i, j in zip(count(), ['foo', 'bar', 'baz']) if j == 'bar']
यह enumerate()
का उपयोग करने की तुलना में बड़ी सूचियों के लिए अधिक कुशल है:
$ python -m timeit -s "from itertools import izip as zip, count" "[i for i, j in zip(count(), ['foo', 'bar', 'baz']*500) if j == 'bar']"
10000 loops, best of 3: 174 usec per loop
$ python -m timeit "[i for i, j in enumerate(['foo', 'bar', 'baz']*500) if j == 'bar']"
10000 loops, best of 3: 196 usec per loop
सभी अनुक्रमणिका प्राप्त करने के लिए:
indexes = [i for i,x in enumerate(xs) if x == 'foo']
index()
मान की पहली अनुक्रमणिका लौटाता है!
| अनुक्रमणिका(...)
| L.index(मान, [शुरू, [रोकें]]) -> पूर्णांक -- मान का पहला सूचकांक लौटाएं
def all_indices(value, qlist):
indices = []
idx = -1
while True:
try:
idx = qlist.index(value, idx+1)
indices.append(idx)
except ValueError:
break
return indices
all_indices("foo", ["foo","bar","baz","foo"])
यदि तत्व सूची में नहीं है तो समस्या उत्पन्न होगी। यह फ़ंक्शन समस्या को संभालता है:
# if element is found it returns index of element else returns None
def find_element_in_list(element, list_element):
try:
index_element = list_element.index(element)
return index_element
except ValueError:
return None
a = ["foo","bar","baz",'bar','any','much']
indexes = [index for index in range(len(a)) if a[index] == 'bar']
आपको यह जांचने के लिए एक शर्त सेट करनी होगी कि आप जो तत्व खोज रहे हैं वह सूची में है या नहीं
if 'your_element' in mylist:
print mylist.index('your_element')
else:
print None
in
सूची में ऑपरेटर के पास रैखिक रनटाइम है। @ApproachingDarknessFish ने कहा कि यह दो बार पुनरावृति करेगा जो आपके प्रश्न का उत्तर देता है, और यह कहना सही है कि रैखिक जटिलता को दोगुना करना कोई बड़ी बात नहीं है। मैं कई उपयोग मामलों में दो बार एक गंभीर नुकसान की सूची में पुनरावृत्ति नहीं कहूंगा, क्योंकि जटिलता सिद्धांत हमें बताता है कि ओ (एन) + ओ (एन) -> ओ (2 * एन) -> ओ (एन), यानी- परिवर्तन आमतौर पर नगण्य है।
यहां प्रस्तावित सभी कार्य अंतर्निहित भाषा व्यवहार को पुन: उत्पन्न करते हैं लेकिन अस्पष्ट है कि क्या हो रहा है।
[i for i in range(len(mylist)) if mylist[i]==myterm] # get the indices
[each for each in mylist if each==myterm] # get the items
mylist.index(myterm) if myterm in mylist else None # get the first index and fail quietly
अपवाद हैंडलिंग के साथ एक फ़ंक्शन क्यों लिखें यदि भाषा आपको वह करने के तरीके प्रदान करती है जो आप स्वयं चाहते हैं?
यदि आप सभी अनुक्रमणिका चाहते हैं, तो आप NumPy का उपयोग कर सकते हैं:
import numpy as np
array = [1, 2, 1, 3, 4, 5, 1]
item = 1
np_array = np.array(array)
item_index = np.where(np_array==item)
print item_index
# Out: (array([0, 2, 6], dtype=int64),)
यह स्पष्ट, पठनीय समाधान है।
किसी आइटम की अनुक्रमणिका ढूँढना एक सूची दी गई है जिसमें इसे पायथन में शामिल किया गया है
सूची
["foo", "bar", "baz"]
और सूची में एक आइटम"bar"
के लिए, पायथन में इसकी अनुक्रमणिका (1) प्राप्त करने का सबसे साफ तरीका क्या है?
ठीक है, निश्चित रूप से, वहाँ सूचकांक विधि है, जो पहली घटना का सूचकांक लौटाती है:
>>> l = ["foo", "bar", "baz"]
>>> l.index('bar')
1
इस पद्धति में कुछ समस्याएं हैं:
- यदि मान सूची में नहीं है, तो आपको एक
ValueError
मिलेगा - यदि सूची में एक से अधिक मान हैं, तो आपको केवल पहले वाले के लिए अनुक्रमणिका मिलती है
कोई मान नहीं
यदि मान अनुपलब्ध हो सकता है, तो आपको ValueError
को पकड़ने की आवश्यकता है।
आप इस तरह की पुन: प्रयोज्य परिभाषा के साथ ऐसा कर सकते हैं:
def index(a_list, value):
try:
return a_list.index(value)
except ValueError:
return None
और इसे इस तरह इस्तेमाल करें:
>>> print(index(l, 'quux'))
None
>>> print(index(l, 'bar'))
1
और इसका नकारात्मक पक्ष यह है कि आपके पास संभवतः एक चेक होगा कि क्या लौटाया गया मान is
या is not
कोई नहीं:
result = index(a_list, value)
if result is not None:
do_something(result)
सूची में एक से अधिक मान
यदि आपके पास अधिक घटनाएं हो सकती हैं, तो आपको list.index
के साथ पूरी जानकारी नहीं प्राप्त होगी:
>>> l.append('bar')
>>> l
['foo', 'bar', 'baz', 'bar']
>>> l.index('bar') # nothing at index 3?
1
आप एक सूची समझ अनुक्रमित में गणना कर सकते हैं:
>>> [index for index, v in enumerate(l) if v == 'bar']
[1, 3]
>>> [index for index, v in enumerate(l) if v == 'boink']
[]
यदि आपके पास कोई घटना नहीं है, तो आप परिणाम की बूलियन जांच के साथ इसकी जांच कर सकते हैं, या यदि आप परिणामों पर लूप करते हैं तो कुछ भी नहीं करें:
indexes = [index for index, v in enumerate(l) if v == 'boink']
for index in indexes:
do_something(index)
पंडों के साथ बेहतर डेटा मंग
यदि आपके पास पांडा हैं, तो आप श्रृंखला वस्तु के साथ यह जानकारी आसानी से प्राप्त कर सकते हैं:
>>> import pandas as pd
>>> series = pd.Series(l)
>>> series
0 foo
1 bar
2 baz
3 bar
dtype: object
एक तुलना जांच बूलियन की एक श्रृंखला लौटाएगी:
>>> series == 'bar'
0 False
1 True
2 False
3 True
dtype: bool
बूलियन की उस श्रृंखला को सबस्क्रिप्ट नोटेशन के माध्यम से श्रृंखला में पास करें, और आपको केवल मिलान करने वाले सदस्य मिलते हैं:
>>> series[series == 'bar']
1 bar
3 bar
dtype: object
यदि आप केवल अनुक्रमणिका चाहते हैं, तो अनुक्रमणिका विशेषता पूर्णांकों की एक श्रृंखला लौटाती है:
>>> series[series == 'bar'].index
Int64Index([1, 3], dtype='int64')
और यदि आप उन्हें किसी सूची या टपल में चाहते हैं, तो बस उन्हें कंस्ट्रक्टर के पास भेज दें:
>>> list(series[series == 'bar'].index)
[1, 3]
हां, आप एन्यूमरेट के साथ एक सूची समझ का भी उपयोग कर सकते हैं, लेकिन यह मेरी राय में उतना ही सुरुचिपूर्ण नहीं है - आप सी में लिखे गए बिल्टिन कोड को संभालने के बजाय पायथन में समानता के लिए परीक्षण कर रहे हैं:
>>> [i for i, value in enumerate(l) if value == 'bar']
[1, 3]
क्या यह एक XY समस्या है?
XY समस्या आपकी वास्तविक समस्या के बजाय आपके प्रयास किए गए समाधान के बारे में पूछ रही है।
आपको क्या लगता है कि आपको सूची में एक तत्व दिए गए सूचकांक की आवश्यकता क्यों है?
यदि आप पहले से ही मूल्य जानते हैं, तो आप इसकी परवाह क्यों करते हैं कि यह सूची में कहां है?
यदि मान नहीं है, तो ValueError
को पकड़ना वर्बोज़ है - और मैं इससे बचना पसंद करता हूं।
मैं आमतौर पर वैसे भी सूची में पुनरावृति कर रहा हूं, इसलिए मैं आमतौर पर किसी भी दिलचस्प जानकारी के लिए एक सूचक रखूंगा, एन्यूमरेट के साथ अनुक्रमणिका प्राप्त कर रहा हूं।< /ए>
यदि आप डेटा मंग रहे हैं, तो आपको शायद पांडा का उपयोग करना चाहिए - जिसमें मेरे द्वारा दिखाए गए शुद्ध पायथन वर्कअराउंड की तुलना में कहीं अधिक सुरुचिपूर्ण उपकरण हैं।
मुझे याद नहीं है कि मुझे स्वयं list.index
की आवश्यकता है। हालांकि, मैंने पायथन मानक पुस्तकालय को देखा है, और मुझे इसके लिए कुछ उत्कृष्ट उपयोग दिखाई देते हैं।
GUI और टेक्स्ट पार्सिंग के लिए idlelib
में इसके कई, कई उपयोग हैं।
keyword
मॉड्यूल इसका उपयोग मॉड्यूल में टिप्पणी मार्कर खोजने के लिए करता है ताकि मेटाप्रोग्रामिंग के माध्यम से इसमें कीवर्ड की सूची को स्वचालित रूप से पुन: उत्पन्न किया जा सके।
ऐसा लगता है कि Lib/mailbox.py में यह ऑर्डर किए गए मैपिंग की तरह उपयोग कर रहा है:
key_list[key_list.index(old)] = new
तथा
del key_list[key_list.index(key)]
Lib/http/cookiejar.py में, अगले महीने प्राप्त करने के लिए उपयोग किया जाता है:
mon = MONTHS_LOWER.index(mon.lower())+1
Lib/tarfile.py में distutils के समान एक आइटम तक एक टुकड़ा प्राप्त करने के लिए:
members = members[:members.index(tarinfo)]
Lib/pickletools.py में:
numtopop = before.index(markobject)
इन उपयोगों में जो समानता प्रतीत होती है, वह यह है कि वे विवश आकारों की सूचियों पर काम करते प्रतीत होते हैं (list.index
के लिए O(n) लुकअप समय के कारण महत्वपूर्ण), और वे ज्यादातर पार्सिंग (और UI में) में उपयोग किए जाते हैं निष्क्रिय का मामला)।
जबकि इसके लिए उपयोग के मामले हैं, वे काफी असामान्य हैं। यदि आप स्वयं को इस उत्तर की तलाश में पाते हैं, तो अपने आप से पूछें कि क्या आप जो कर रहे हैं वह आपके उपयोग-मामले के लिए भाषा द्वारा प्रदान किए गए टूल का सबसे प्रत्यक्ष उपयोग है।
zip
फ़ंक्शन वाले सभी इंडेक्स:
get_indexes = lambda x, xs: [i for (y, i) in zip(xs, range(len(xs))) if x == y]
print get_indexes(2, [1, 2, 3, 4, 5, 6, 3, 2, 3, 2])
print get_indexes('f', 'xsfhhttytffsafweef')
एक सूची में सभी घटनाओं और एक या अधिक (समान) वस्तुओं की स्थिति प्राप्त करना
एन्यूमरेट (एलीस्ट) के साथ आप पहले तत्व (एन) को स्टोर कर सकते हैं जो सूची की अनुक्रमणिका है जब तत्व x आपके द्वारा खोजे जाने के बराबर होता है।
>>> alist = ['foo', 'spam', 'egg', 'foo']
>>> foo_indexes = [n for n,x in enumerate(alist) if x=='foo']
>>> foo_indexes
[0, 3]
>>>
आइए अपने फंक्शन को फाइंडइंडेक्स बनाते हैं
यह फ़ंक्शन आइटम और सूची को तर्क के रूप में लेता है और सूची में आइटम की स्थिति लौटाता है, जैसा कि हमने पहले देखा था।
def indexlist(item2find, list_or_string):
"Returns all indexes of an item in a list or a string"
return [n for n,item in enumerate(list_or_string) if item==item2find]
print(indexlist("1", "010101010"))
आउटपुट
[1, 3, 5, 7]
सरल
for n, i in enumerate([1, 2, 3, 4, 1]):
if i == 1:
print(n)
आउटपुट:
0
4
बस आप साथ जा सकते हैं
a = [['hand', 'head'], ['phone', 'wallet'], ['lost', 'stock']]
b = ['phone', 'lost']
res = [[x[0] for x in a].index(y) for y in b]
एक अन्य विकल्प
>>> a = ['red', 'blue', 'green', 'red']
>>> b = 'red'
>>> offset = 0;
>>> indices = list()
>>> for i in range(a.count(b)):
... indices.append(a.index(b,offset))
... offset = indices[-1]+1
...
>>> indices
[0, 3]
>>>
और अब पूरी तरह से अलग कुछ करने के लिए...
... जैसे सूचकांक प्राप्त करने से पहले वस्तु के अस्तित्व की पुष्टि करना। इस दृष्टिकोण के बारे में अच्छी बात यह है कि फ़ंक्शन हमेशा सूचकांकों की एक सूची देता है - भले ही यह एक खाली सूची हो। यह स्ट्रिंग्स के साथ भी काम करता है।
def indices(l, val):
"""Always returns a list containing the indices of val in the_list"""
retval = []
last = 0
while val in l[last:]:
i = l[last:].index(val)
retval.append(last + i)
last += i + 1
return retval
l = ['bar','foo','bar','baz','bar','bar']
q = 'bar'
print indices(l,q)
print indices(l,'bat')
print indices('abcdaababb','a')
जब एक इंटरैक्टिव पायथन विंडो में चिपकाया जाता है:
Python 2.7.6 (v2.7.6:3a1db0d2747e, Nov 10 2013, 00:42:54)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def indices(the_list, val):
... """Always returns a list containing the indices of val in the_list"""
... retval = []
... last = 0
... while val in the_list[last:]:
... i = the_list[last:].index(val)
... retval.append(last + i)
... last += i + 1
... return retval
...
>>> l = ['bar','foo','bar','baz','bar','bar']
>>> q = 'bar'
>>> print indices(l,q)
[0, 2, 4, 5]
>>> print indices(l,'bat')
[]
>>> print indices('abcdaababb','a')
[0, 4, 5, 7]
>>>
अद्यतन
हेड-डाउन पायथन विकास के एक और वर्ष के बाद, मैं अपने मूल उत्तर से थोड़ा शर्मिंदा हूं, इसलिए रिकॉर्ड को सीधे सेट करने के लिए, कोई निश्चित रूप से उपरोक्त कोड का उपयोग कर सकता है; हालांकि, समान व्यवहार प्राप्त करने के लिए अधिक अधिक मुहावरेदार तरीका सूची समझ का उपयोग करना होगा, साथ में गणना () फ़ंक्शन।
कुछ इस तरह:
def indices(l, val):
"""Always returns a list containing the indices of val in the_list"""
return [index for index, value in enumerate(l) if value == val]
l = ['bar','foo','bar','baz','bar','bar']
q = 'bar'
print indices(l,q)
print indices(l,'bat')
print indices('abcdaababb','a')
जो, जब एक इंटरैक्टिव पायथन विंडो में चिपकाया जाता है:
Python 2.7.14 |Anaconda, Inc.| (default, Dec 7 2017, 11:07:58)
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def indices(l, val):
... """Always returns a list containing the indices of val in the_list"""
... return [index for index, value in enumerate(l) if value == val]
...
>>> l = ['bar','foo','bar','baz','bar','bar']
>>> q = 'bar'
>>> print indices(l,q)
[0, 2, 4, 5]
>>> print indices(l,'bat')
[]
>>> print indices('abcdaababb','a')
[0, 4, 5, 7]
>>>
और अब, इस प्रश्न और सभी उत्तरों की समीक्षा करने के बाद, मुझे एहसास हुआ कि यह वही है जो FMc ने अपने पहले का जवाब. जिस समय मैंने मूल रूप से इस प्रश्न का उत्तर दिया था, उस समय मैंने उस उत्तर को देख भी नहीं देखा था, क्योंकि मैं इसे समझ नहीं पाया था। मुझे आशा है कि मेरा कुछ और वर्बोज़ उदाहरण समझने में सहायता करेगा।
यदि उपरोक्त कोड की एक पंक्ति अभी भी आपको नहीं समझ में आती है, तो मैं आपको Google 'पायथन सूची समझ' की अत्यधिक अनुशंसा करता हूं और स्वयं को परिचित करने के लिए कुछ मिनट दें। यह कई शक्तिशाली विशेषताओं में से एक है जो कोड विकसित करने के लिए पायथन का उपयोग करने में खुशी देता है।
FMc और user7177 के उत्तर पर एक संस्करण एक ऐसा निर्देश देगा जो किसी भी प्रविष्टि के लिए सभी सूचकांक वापस कर सकता है:
>>> a = ['foo','bar','baz','bar','any', 'foo', 'much']
>>> l = dict(zip(set(a), map(lambda y: [i for i,z in enumerate(a) if z is y ], set(a))))
>>> l['foo']
[0, 5]
>>> l ['much']
[6]
>>> l
{'baz': [2], 'foo': [0, 5], 'bar': [1, 3], 'any': [4], 'much': [6]}
>>>
एकल प्रविष्टि के लिए सभी सूचकांक प्राप्त करने के लिए आप इसे एक लाइनर के रूप में भी उपयोग कर सकते हैं। दक्षता के लिए कोई गारंटी नहीं है, हालांकि मैंने लैम्ब्डा को कॉल करने की संख्या को कम करने के लिए सेट (ए) का उपयोग किया था।
यह समाधान दूसरों की तरह शक्तिशाली नहीं है, लेकिन यदि आप एक नौसिखिया हैं और केवल for
लूप के बारे में जानते हैं तो ValueError से बचते हुए किसी आइटम की पहली अनुक्रमणिका ढूंढना अभी भी संभव है:
def find_element(p,t):
i = 0
for e in p:
if e == t:
return i
else:
i +=1
return -1
सूची एल में आइटम एक्स की अनुक्रमणिका ढूँढना:
idx = L.index(x) if (x in L) else -1
चूंकि पायथन सूचियां शून्य-आधारित हैं, इसलिए हम ज़िप बिल्ट-इन फ़ंक्शन का उपयोग निम्नानुसार कर सकते हैं:
>>> [i for i,j in zip(range(len(haystack)), haystack) if j == 'needle' ]
जहां "घास का ढेर" प्रश्न में सूची है और "सुई" देखने के लिए वस्तु है।
(नोट: यहां हम अनुक्रमणिका प्राप्त करने के लिए i का उपयोग करके पुनरावृति कर रहे हैं, लेकिन अगर हमें उन वस्तुओं पर ध्यान केंद्रित करने की आवश्यकता है जिन्हें हम j पर स्विच कर सकते हैं।)
name ="bar"
list = [["foo", 1], ["bar", 2], ["baz", 3]]
new_list=[]
for item in list:
new_list.append(item[0])
print(new_list)
try:
location= new_list.index(name)
except:
location=-1
print (location)
इसका कारण यह है कि यदि स्ट्रिंग सूची में भी नहीं है, यदि यह सूची में नहीं है तो location = -1
यदि आइटम नहीं मिला तो पायथन index()
विधि एक त्रुटि फेंकता है। तो इसके बजाय आप इसे जावास्क्रिप्ट के indexOf()
फ़ंक्शन के समान बना सकते हैं जो आइटम नहीं मिलने पर -1
लौटाता है:
try:
index = array.index('search_keyword')
except ValueError:
index = -1
इसका एक अधिक कार्यात्मक उत्तर है।
list(filter(lambda x: x[1]=="bar",enumerate(["foo", "bar", "baz", "bar", "baz", "bar", "a", "b", "c"])))
अधिक सामान्य रूप:
def get_index_of(lst, element):
return list(map(lambda x: x[0],\
(list(filter(lambda x: x[1]==element, enumerate(lst))))))
Scala
/ कार्यात्मक-प्रोग्रामिंग उत्साही लोगों के लिए घर जैसा लगता है
आपके पास जो सूची है, उसे lst
नाम दें। कोई सूची lst
को numpy array
में बदल सकता है। और, फिर numpy.where सूची में चुने गए आइटम की अनुक्रमणिका प्राप्त करने के लिए। निम्नलिखित वह तरीका है जिससे आप इसे लागू करेंगे।
import numpy as np
lst = ["foo", "bar", "baz"] #lst: : 'list' data type
print np.where( np.array(lst) == 'bar')[0][0]
>>> 1
मेरे जैसी दूसरी भाषा से आने वालों के लिए, शायद एक साधारण लूप के साथ इसे समझना और इसका उपयोग करना आसान है:
mylist = ["foo", "bar", "baz", "bar"]
newlist = enumerate(mylist)
for index, item in newlist:
if item == "bar":
print(index, item)
मैं के लिए आभारी हूं, तो एन्यूमरेट वास्तव में क्या करता है? . इससे मुझे समझने में मदद मिली।
यदि प्रदर्शन चिंता का विषय है:
कई उत्तरों में यह उल्लेख किया गया है कि list.index(item)
विधि की अंतर्निहित विधि एक O(n) एल्गोरिथम है। यह ठीक है अगर आपको इसे एक बार करने की ज़रूरत है। लेकिन अगर आपको तत्वों के सूचकांकों को कई बार एक्सेस करने की आवश्यकता है, तो पहले आइटम-इंडेक्स जोड़े का एक शब्दकोश (ओ (एन)) बनाने के लिए और अधिक समझ में आता है, और फिर इंडेक्स को ओ (1) पर हर बार एक्सेस करने की आवश्यकता होती है। यह।
यदि आप सुनिश्चित हैं कि आपकी सूची में आइटम कभी भी दोहराए नहीं जाते हैं, तो आप आसानी से कर सकते हैं:
myList = ["foo", "bar", "baz"]
# Create the dictionary
myDict = dict((e,i) for i,e in enumerate(myList))
# Lookup
myDict["bar"] # Returns 1
# myDict.get("blah") if you don't want an error to be raised if element not found.
यदि आपके पास डुप्लिकेट तत्व हो सकते हैं, और उनके सभी सूचकांक वापस करने की आवश्यकता है:
from collections import defaultdict as dd
myList = ["foo", "bar", "bar", "baz", "foo"]
# Create the dictionary
myDict = dd(list)
for i,e in enumerate(myList):
myDict[e].append(i)
# Lookup
myDict["foo"] # Returns [0, 4]
जैसा कि @TerryA द्वारा इंगित किया गया है, कई उत्तर चर्चा करते हैं कि एक अनुक्रमणिका कैसे खोजें।
more_itertools
एकाधिक< का पता लगाने के लिए टूल के साथ एक तृतीय-पक्ष लाइब्रेरी है /em> एक पुनरावर्तनीय के भीतर सूचकांक।
दिया गया
import more_itertools as mit
iterable = ["foo", "bar", "baz", "ham", "foo", "bar", "baz"]
कोड
एकाधिक अवलोकनों के सूचकांक खोजें:
list(mit.locate(iterable, lambda x: x == "bar"))
# [1, 5]
कई वस्तुओं का परीक्षण करें:
list(mit.locate(iterable, lambda x: x in {"bar", "ham"}))
# [1, 3, 5]
more_itertools.locate
के साथ और विकल्प भी देखें . > pip install more_itertools
के ज़रिए इंस्टॉल करें।
ValueError को रोकने के लिए, आप इसे करने के लिए एक फ़ंक्शन बना सकते हैं, हालांकि एक वर्ग भी काम करेगा।
def findInList(List, item):
try:
return List.index(item)
except ValueError:
return -1
एकमात्र समस्या यह है कि इससे बग को ट्रैक करना मुश्किल हो सकता है; वही अन्य नंबरों पर लागू होगा।
हालांकि, अगर यह किसी संख्या के अलावा कुछ भी लौटाता है, तो संभवतः इसका उपयोग सूची अनुक्रमणिका के रूप में किया जाएगा, और किसी भी तरह से अनिवार्य रूप से एक त्रुटि होगी।
मेरी राय में, यह मानते हुए कि आइटम नहीं मिलने पर कुछ गलत हो गया है, try
-except
का उपयोग करना बेहतर है, लेकिन एक कस्टम त्रुटि संदेश के साथ, और इस प्रकार यह डिबगिंग को कठिन नहीं बनाएगा, न ही वापसी मूल्य मायने रखेगा:
# python 3.x
class itemNotFoundInListError(Exception):
pass
def findInList(List, item):
try:
return List.index(item)
except ValueError:
raise itemNotFoundInListError(f"List `{List}` does not contain `{item}.`")
शब्दकोश का उपयोग करते हुए, जहां पहले सूची को संसाधित करें और फिर उसमें अनुक्रमणिका जोड़ें
from collections import defaultdict
index_dict = defaultdict(list)
word_list = ['foo','bar','baz','bar','any', 'foo', 'much']
for word_index in range(len(word_list)) :
index_dict[word_list[word_index]].append(word_index)
word_index_to_find = 'foo'
print(index_dict[word_index_to_find])
# output : [0, 5]
एक मौका है कि वह मान मौजूद नहीं हो सकता है इसलिए इस ValueError से बचने के लिए, हम जांच सकते हैं कि क्या वह वास्तव में सूची में मौजूद है।
list = ["foo", "bar", "baz"]
item_to_find = "foo"
if item_to_find in list:
index = list.index(item_to_find)
print("Index of the item is " + str(index))
else:
print("That word does not exist")
एक तुलनीय के लिए
# Throws ValueError if nothing is found
some_list = ['foo', 'bar', 'baz'].index('baz')
# some_list == 2
कस्टम विधेय
some_list = [item1, item2, item3]
# Throws StopIteration if nothing is found
# *unless* you provide a second parameter to `next`
index_of_value_you_like = next(
i for i, item in enumerate(some_list)
if item.matches_your_criteria())
विधेय द्वारा सभी वस्तुओं का सूचकांक ढूँढना
index_of_staff_members = [
i for i, user in enumerate(users)
if user.is_staff()]
idx = next((i for i, v in enumerate(ls) if v == chk), -1)
str.index(chk) के समान व्यवहार प्राप्त करने के लिए।
यह सिर्फ पायथन फ़ंक्शन array.index()
का उपयोग करता है और एक साधारण कोशिश के साथ / यह सूची में पाए जाने पर रिकॉर्ड की स्थिति देता है और यदि यह सूची में नहीं मिलता है तो वापसी -1 (जैसे जावास्क्रिप्ट के साथ फ़ंक्शन indexOf()
)।
fruits = ['apple', 'banana', 'cherry']
try:
pos = fruits.index("mango")
except:
pos = -1
इस मामले में "आम" सूची में मौजूद नहीं है fruits
इसलिए pos
चर -1 है, अगर मैंने "चेरी" की खोज की थी तो pos
चर 2 होगा।
संबंधित सवाल
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।
"bar"
के कई उदाहरण होने पर सबसे कम सूचकांक, [2]"bar"
के सभी सूचकांक?