index()কেবলমাত্র একটি তালিকায় কোনও আইটেমের প্রথম উপস্থিতি দেবে। একটি ঝরঝরে কৌশল যা তালিকার সমস্ত সূচক ফেরত দেয়?
index()কেবলমাত্র একটি তালিকায় কোনও আইটেমের প্রথম উপস্থিতি দেবে। একটি ঝরঝরে কৌশল যা তালিকার সমস্ত সূচক ফেরত দেয়?
উত্তর:
আপনি একটি তালিকা বোধগম্যতা ব্যবহার করতে পারেন:
indices = [i for i, x in enumerate(my_list) if x == "whatever"]
enumerate২.৩ এ দেখানো হয়েছে, ২.৩ এ। হ্যাঁ, যদি আপনার পাইথনটি প্রাচীন হয় তবে ব্যবহার করুন 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স্মেথের সাথে তুলনা করেন। আপনি বুলিয়ান মানগুলির একটি অ্যারে পাবেন। তারপরে সেই অ্যারের 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বৃহত তালিকার সাথে তালিকার বোঝাপড়ার চেয়ে অনেক দ্রুত faster আপনার যদি ইতিমধ্যে অ্যারে থাকে তবে এটি 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)
প্রত্যাশিত হিসাবে হয়।
পাইথন 2 এ ফিল্টার () ব্যবহার করা।
>>> 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)
গণনা করা (অলিস্ট) দিয়ে আপনি প্রথম উপাদানটি (এন) সংরক্ষণ করতে পারেন যা তালিকার সূচী হয় যখন এলিমেন্টটি আপনি যা পছন্দ করেন তার সমান হয়।
>>> 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]কোনও মিল আছে valuetoindices
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]