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.array
list
list
और str
जाहिर है, आप पास हो False
गए np.where
। जब आप np.array
smth से तुलना करते हैं। आपको बूलियन मानों की एक सरणी मिलती है। फिर उस सरणी 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
और अधिक कुशल और पाइथोनिक हैं, हालांकि, यह उत्तर उन छात्रों के लिए है, जिन्हें उन कुछ अंतर्निहित कार्यों का उपयोग करने की अनुमति नहीं दी जा सकती है ।indices
for 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
साथ कार्यान्वित किए जाते हैं । इस मामले में, सूची, एस का एक समूह है , इसलिए हम खोज करते हैं , इसे ए के रूप में भी परिभाषित किया गया है ।n
int
value
int
while-loop
और .index
:.index
, त्रुटि से निपटने केtry-except
लिए उपयोग करें क्योंकि सूची में नहीं होने पर होगा ।ValueError
value
def 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]