index()किसी सूची में आइटम की पहली घटना देगा। क्या कोई साफ-सुथरी चाल है जो किसी सूची में सभी सूचकांकों को लौटाती है?
index()किसी सूची में आइटम की पहली घटना देगा। क्या कोई साफ-सुथरी चाल है जो किसी सूची में सभी सूचकांकों को लौटाती है?
जवाबों:
आप एक सूची समझ का उपयोग कर सकते हैं:
indices = [i for i, x in enumerate(my_list) if x == "whatever"]
enumerateमें 2.3 पर सूची की समझ दिखाई गई । तो हाँ, अगर आपका पायथन प्राचीन है, तो उपयोग करें filter()।
print([i for i, x in enumerate([[1,1],[0,1]]) if x == 1])रिटर्न । [][[0, 1], [0, 0], [1, 1]]
(a == 1).nonzero()NumPy सरणी के लिए चीजों को करने की अनुमति देता है a।
जबकि सीधे सूचियों के लिए समाधान नहीं, numpyवास्तव में इस तरह की चीज के लिए चमकता है:
import numpy as np
values = np.array([1,2,3,1,2,4,5,6,3,2,1])
searchval = 3
ii = np.where(values == searchval)[0]
रिटर्न:
ii ==>array([2, 8])
यह बड़ी संख्या में तत्वों बनाम कुछ अन्य समाधानों के साथ सूचियों (सरणियों) के लिए काफी तेज हो सकता है।
[0]की जरूरत है क्योंकि ' whereरिटर्न टपल(array([2, 8], dtype=int64),)
all_id_resp_addressहोना चाहिए । np.arraylist
listऔर strजाहिर है, आप पास हो Falseगए np.where। जब आप np.arraysmth से तुलना करते हैं। आपको बूलियन मानों की एक सरणी मिलती है। फिर उस सरणी np.whereके सभी Trueमानों की स्थिति का पता लगाता है ।
एक समाधान का उपयोग कर list.index:
def indices(lst, element):
result = []
offset = -1
while True:
try:
offset = lst.index(element, offset+1)
except ValueError:
return result
result.append(offset)
enumerateबड़ी सूचियों के लिए यह सूची की तुलना में बहुत तेज है । यदि आपके पास पहले से ही सरणी है, तो यह numpyसमाधान की तुलना में बहुत धीमा है , अन्यथा गति लाभ को परिवर्तित करने की लागत (100, 1000 और 10000 तत्वों के साथ पूर्णांक सूचियों पर परीक्षण)।
नोट: क्रिस का एक टिप्पणी के आधार पर सावधानी की टिप्पणी: यह समाधान सूची की समझ से अधिक तेज़ है यदि परिणाम पर्याप्त रूप से विरल हैं, लेकिन यदि सूची में तत्व के कई उदाहरण हैं जो खोजा जा रहा है (सूची का ~ 15% से अधिक) , 1000 पूर्णांकों की सूची के साथ एक परीक्षण पर), सूची की समझ तेज है।
timeit.timeitयादृच्छिक रूप से उत्पन्न सूचियों के साथ उपयोग करता था। हालांकि यह एक महत्वपूर्ण बिंदु है, और मुझे लगता है कि आप क्यों पूछ सकते हैं। उस समय यह मेरे साथ नहीं हुआ था, लेकिन यदि परिणाम पर्याप्त रूप से विरल हैं, तो गति लाभ केवल सच है। मैंने बस खोज करने के लिए तत्व से भरी सूची के साथ परीक्षण किया है, और यह सूची समझ से बहुत धीमी है।
more_itertools.locate एक शर्त को पूरा करने वाले सभी आइटमों के लिए सूचकांक ढूंढता है।
from more_itertools import locate
list(locate([0, 1, 1, 0, 1, 0, 0]))
# [1, 2, 4]
list(locate(['a', 'b', 'c', 'b'], lambda x: x == 'b'))
# [1, 3]
more_itertoolsएक तृतीय-पक्ष पुस्तकालय है > pip install more_itertools।
conda installहाल ही में प्रदर्शन में बहुत अस्थिर हो गया है)
सभी घटनाओं के लिए एक और समाधान (क्षमा करें यदि डुप्लिकेट है):
values = [1,2,3,1,2,4,5,6,3,2,1]
map(lambda val: (val, [i for i in xrange(len(values)) if values[i] == val]), values)
या उपयोग range(अजगर 3):
l=[i for i in range(len(lst)) if lst[i]=='something...']
के लिए (अजगर 2):
l=[i for i in xrange(len(lst)) if lst[i]=='something...']
और फिर (दोनों मामले):
print(l)
जैसी उम्मीद है।
Python2 में फ़िल्टर () का उपयोग करना।
>>> q = ['Yeehaw', 'Yeehaw', 'Googol', 'B9', 'Googol', 'NSM', 'B9', 'NSM', 'Dont Ask', 'Googol']
>>> filter(lambda i: q[i]=="Googol", range(len(q)))
[2, 4, 9]
आप एक डिफ़ॉल्ट बना सकते हैं
from collections import defaultdict
d1 = defaultdict(int) # defaults to 0 values for keys
unq = set(lst1) # lst1 = [1, 2, 2, 3, 4, 1, 2, 7]
for each in unq:
d1[each] = lst1.count(each)
else:
print(d1)
गणनाकर्ता (एलिस्ट) के साथ आप पहले तत्व (n) को स्टोर कर सकते हैं जो सूची का सूचकांक है जब तत्व 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
for-loop:enumerateऔर अधिक कुशल और पाइथोनिक हैं, हालांकि, यह उत्तर उन छात्रों के लिए है, जिन्हें उन कुछ अंतर्निहित कार्यों का उपयोग करने की अनुमति नहीं दी जा सकती है ।indicesfor i in range(len(x)):, जो अनिवार्य रूप से सूचकांक स्थानों की सूची के माध्यम से पुनरावृत्त करता है[0, 1, 2, 3, ..., len(x)-1]i, जहां x[i]से मिलान करना है value, कोindices
def get_indices(x: list, value: int) -> list:
indices = list()
for i in range(len(x)):
if x[i] == value:
indices.append(i)
return indices
n = [1, 2, 3, -50, -60, 0, 6, 9, -60, -60]
print(get_indices(n, -60))
>>> [4, 8, 9]
get_indices साथ कार्यान्वित किए जाते हैं । इस मामले में, सूची, एस का एक समूह है , इसलिए हम खोज करते हैं , इसे ए के रूप में भी परिभाषित किया गया है ।nintvalueintwhile-loopऔर .index:.index, त्रुटि से निपटने केtry-except लिए उपयोग करें क्योंकि सूची में नहीं होने पर होगा ।ValueErrorvaluedef get_indices(x: list, value: int) -> list:
indices = list()
i = 0
while True:
try:
# find an occurrence of value and update i to that index
i = x.index(value, i)
# add i to the list
indices.append(i)
# advance i by 1
i += 1
except ValueError as e:
break
return indices
print(get_indices(n, -60))
>>> [4, 8, 9]
get_indeicesसामान्य सूची की तुलना में थोड़ा तेज (~ 15%) है। मैं इसका पता लगाने की कोशिश कर रहा हूं।
यदि आप पायथन 2 का उपयोग कर रहे हैं, तो आप इसके साथ समान कार्यक्षमता प्राप्त कर सकते हैं:
f = lambda my_list, value:filter(lambda x: my_list[x] == value, range(len(my_list)))
my_listवह सूची कहां है जिसे आप अनुक्रमणिका प्राप्त करना चाहते हैं, और valueखोजा गया मान है। उपयोग:
f(some_list, some_element)
यदि आपको कुछ सूचकांकों के बीच सभी तत्वों की स्थिति की खोज करने की आवश्यकता है , तो आप उन्हें बता सकते हैं:
[i for i,x in enumerate([1,2,3,2]) if x==2 & 2<= i <=3] # -> [3]