[python] किसी आइटम की अनुक्रमणिका को पाइथन में एक सूची दी गई है


Answers

एक चीज जो पाइथन सीखने में वास्तव में सहायक है, इंटरैक्टिव हेल्प फ़ंक्शन का उपयोग करना है:

>>> help(["foo", "bar", "baz"])
Help on list object:

class list(object)
 ...

 |
 |  index(...)
 |      L.index(value, [start, [stop]]) -> integer -- return first index of value
 |

जो आपको उस विधि के लिए ले जाएगा जो आप खोज रहे हैं।

Question

एक सूची ["foo", "bar", "baz"] और सूची "bar" में एक आइटम के लिए, पाइथन में इसकी अनुक्रमणिका (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))))))



एक सूची में सभी घटनाओं और एक या अधिक (समान) वस्तुओं की स्थिति प्राप्त करना

एन्युमरेट (एलीस्ट) के साथ आप पहले तत्व (एन) को स्टोर कर सकते हैं जो कि सूची x का सूचकांक है जब तत्व x आपके द्वारा देखे जाने वाले बराबर होता है।

>>> alist = ['foo','spam','egg','foo']
>>> foo_indexes = [n for n,x in enumerate(alist) if x=='foo']
>>> foo_indexes
[0, 3]
>>>

चलिए अपने फंक्शन findindex बनाते हैं

यह फ़ंक्शन आइटम और सूची को तर्क के रूप में लेता है और सूची में आइटम की स्थिति वापस लौटाता है, जैसा कि हमने पहले देखा था।

def findindex(item2find,listOrString):
  "Search indexes of an item (arg.1) contained in a list or a string (arg.2)"
  return [n for n,item in enumerate(listOrString) if item==item2find]

indexes1 = findindex("1","010101010")
print(indexes1)

उत्पादन

[1, 3, 5, 7]



ज़िप समारोह के साथ सभी इंडेक्स

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')



यदि आप सभी इंडेक्स चाहते हैं, तो आप 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),)

यह स्पष्ट, पठनीय समाधान है।




सभी इंडेक्स प्राप्त करने के लिए:

 indexes = [i for i,x in enumerate(xs) if x == 'foo']



और अब पूरी तरह से अलग कुछ करने के लिए...

... इंडेक्स प्राप्त करने से पहले आइटम के अस्तित्व की पुष्टि करना। इस दृष्टिकोण के बारे में अच्छी बात यह है कि फ़ंक्शन हमेशा सूचकांक की एक सूची देता है - भले ही यह एक खाली सूची हो। यह तारों के साथ भी काम करता है।

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]
>>> 



चूंकि पायथन सूची शून्य-आधारित हैं, इसलिए हम ज़िप अंतर्निहित फ़ंक्शन का उपयोग निम्नानुसार कर सकते हैं:

>>> [i for i,j in zip(range(len(haystack)),haystack) if j == 'needle' ] 

जहां "हैस्टैक" प्रश्न में सूची है और "सुई" आइटम देखने के लिए है।

(नोट: यहां हम इंडेक्स प्राप्त करने के लिए उपयोग कर रहे हैं लेकिन अगर हमें वस्तुओं पर ध्यान केंद्रित करने की आवश्यकता है तो हम j पर स्विच कर सकते हैं)




यदि तत्व सूची में नहीं है तो एक समस्या उत्पन्न होगी। यह फ़ंक्शन समस्या को संभालता है:

# 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



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

if 'your_element' in mylist:
    print mylist.index('your_element')
else:
    print None



एक अन्य विकल्प

>>> 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]
>>> 



Links



Tags

python python   list