তালিকার একটি তালিকা ["foo", "bar", "baz"]
এবং একটি আইটেম দেওয়া হয়েছে "bar"
, আমি 1
পাইথনে এটির সূচক ( ) কীভাবে পাব ?
তালিকার একটি তালিকা ["foo", "bar", "baz"]
এবং একটি আইটেম দেওয়া হয়েছে "bar"
, আমি 1
পাইথনে এটির সূচক ( ) কীভাবে পাব ?
উত্তর:
>>> ["foo", "bar", "baz"].index("bar")
1
তথ্যসূত্র: ডেটা স্ট্রাকচার> তালিকাগুলিতে আরও
লক্ষ্য করুন যখন এই সম্ভবত পরিষ্কার ভাবে প্রশ্নের উত্তর দিতে হয় যেমন জিজ্ঞাসা , index
একটি বরং দুর্বল উপাদান list
এপিআই, এবং আমি শেষ বারের মত আমি রাগ এটি ব্যবহৃত মনে করতে পারেন না। মন্তব্যগুলিতে এটি আমার দিকে ইঙ্গিত করা হয়েছে যে কারণ এই উত্তরটি ভারীভাবে উল্লেখ করা হয়েছে, তাই এটি আরও সম্পূর্ণ করা উচিত। list.index
অনুসরণ সম্পর্কে কিছু সতর্কতা । প্রাথমিকভাবে এটির জন্য ডকুমেন্টেশন একবার দেখে নেওয়া উপযুক্ত:
list.index(x[, start[, end]])
প্রথম আইটেমের তালিকায় শূন্য-ভিত্তিক সূচকটি ফিরে আসুন যার মান x এর সমান ।
ValueError
এমন কোনও আইটেম না থাকলে একটি উত্থাপন করে ।ঐচ্ছিক আর্গুমেন্ট শুরু এবং শেষ হিসেবে ব্যাখ্যা করা হয় ফালি স্বরলিপি এবং তালিকা একটি বিশেষ subsequence সার্চ সীমিত করতে ব্যবহার করা হয়। প্রত্যাবর্তিত সূচকটি শুরুর যুক্তির পরিবর্তে সম্পূর্ণ সিকোয়েন্সের শুরুর তুলনায় গণনা করা হয়।
একটি 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
এখানে প্রস্তাবিত সমস্ত ফাংশন সহজাত ভাষার আচরণের পুনরুত্পাদন করে তবে যা চলছে তা অস্পষ্ট করে।
[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]
এক্সওয়াই সমস্যাটি আপনার আসল সমস্যার চেয়ে আপনার চেষ্টা করা সমাধান সম্পর্কে জিজ্ঞাসা করছে।
আপনি কেন তালিকার একটি উপাদান প্রদত্ত সূচকের প্রয়োজন বলে মনে করেন?
আপনি যদি ইতিমধ্যে মানটি জানেন তবে কেন এটি তালিকায় রয়েছে সেদিকে কেন যত্ন করবেন?
মানটি যদি না থাকে তবে ধরা হচ্ছে ValueError
এটি ভার্চুয়াস - এবং আমি এড়াতে পছন্দ করি।
আমি সাধারণত যেভাবেই তালিকাটির উপরে পুনরাবৃত্তি করছি, সুতরাং আমি সাধারণত কোনও আকর্ষণীয় তথ্যকে নির্দেশক রাখব, গণনা সহ সূচকটি পেয়ে যাব ।
যদি আপনি ডেটা মংগ করছেন তবে আপনার সম্ভবত প্যান্ডাস ব্যবহার করা উচিত - যা আমি দেখিয়েছি খাঁটি পাইথন ওয়ার্কআউন্ডের তুলনায় অনেক বেশি দুর্দান্ত সরঞ্জাম রয়েছে।
আমি list.index
নিজেকে প্রয়োজন মনে করি না । যাইহোক, আমি পাইথন স্ট্যান্ডার্ড লাইব্রেরিটি দেখেছি এবং এর জন্য কিছু দুর্দান্ত ব্যবহার দেখতে পাচ্ছি।
এটির জন্য অনেকগুলি, অনেকগুলি ব্যবহার রয়েছে idlelib
জিইউআই এবং পাঠ্য পার্সিংয়ের ।
দ্য keyword
মডিউল ব্যবহার এটি স্বয়ংক্রিয়ভাবে metaprogramming মাধ্যমে এটি কীওয়ার্ড তালিকা পুনর্জাত মডিউলে মন্তব্য মার্কার খুঁজে।
লিবি / মেলবক্স.পিতে মনে হচ্ছে এটি কোনও আদেশযুক্ত ম্যাপিংয়ের মতো ব্যবহার করছে:
key_list[key_list.index(old)] = new
এবং
del key_list[key_list.index(key)]
লিবিব / এইচপি / কুকিজার.পি-তে, পরের মাসটি ব্যবহার করার জন্য ব্যবহার করা হয় বলে মনে হচ্ছে:
mon = MONTHS_LOWER.index(mon.lower())+1
একটি আইটেমের টুকরো টুকরো পাওয়ার জন্য লিবি / টারফাইল.পি-তে ডিস্টিওলের মতো:
members = members[:members.index(tarinfo)]
লিবি / পিকলেটুলস.পিতে:
numtopop = before.index(markobject)
এই ব্যবহারগুলি যেগুলি সাধারণ বলে মনে হয় তা হ'ল তারা সীমিত আকারের তালিকাগুলির উপর কাজ করে বলে মনে হচ্ছে (ও (এন) কারণে দেখার সময় দেখার জন্য গুরুত্বপূর্ণ list.index
এবং এগুলি বেশিরভাগ ক্ষেত্রে পার্সিং (এবং আইডলের ক্ষেত্রে ইউআই) ব্যবহার করা হয়।
যদিও এর জন্য ব্যবহারের ক্ষেত্রে রয়েছে, তারা মোটামুটি অস্বাভাবিক। যদি আপনি নিজেকে এই উত্তরটির সন্ধান করতে দেখেন তবে নিজেকে জিজ্ঞাসা করুন আপনি কী করছেন তা আপনার ব্যবহারের ক্ষেত্রে ভাষার দ্বারা সরবরাহিত সরঞ্জামগুলির মধ্যে সর্বাধিক সরাসরি ব্যবহার।
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')
গণনা (আলিস্ট) দিয়ে আপনি প্রথম উপাদানটি (এন) সংরক্ষণ করতে পারেন যা তালিকার সূচী হয় যখন এলিমেন্টটি আপনি যা পছন্দ করেন তার সমান হয়।
>>> 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 = ['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]
>>>
এবং এখন, এই প্রশ্ন এবং সমস্ত উত্তরগুলি পর্যালোচনা করার পরে, আমি বুঝতে পারি যে এফএমসি তার আগের উত্তরটিতে ঠিক একই পরামর্শ দিয়েছে । আমি মূলত এই প্রশ্নের উত্তর দিয়েছিলাম এমন সময়, আমি দেখিনি সেই উত্তরটিও পাইনি, কারণ আমি তা বুঝতে পারি নি। আমি আশা করি যে আমার আরও কিছু ভারবস উদাহরণটি বুঝতে সহায়তা করবে।
যদি উপরে একক কোডের লাইনটি এখনও আপনার কাছে বোঝায় না , তবে আমি আপনাকে গুগলের 'অজগর তালিকার বোঝাপড়া'র জন্য অত্যন্ত পরামর্শ দিচ্ছি এবং নিজেকে পরিচিত করতে কয়েক মিনিট সময় নিচ্ছি। কোডটি বিকাশের জন্য পাইথন ব্যবহার করে এটি আনন্দিত করে এমন অনেক শক্তিশালী বৈশিষ্ট্যগুলির মধ্যে এটি একটি।
এফএমসি এবং ব্যবহারকারী 7177 এর উত্তরের একটি বৈকল্পিক একটি ডিক্ট দেবে যা কোনও প্রবেশের জন্য সমস্ত সূচকগুলি ফিরিয়ে দিতে পারে:
>>> 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]}
>>>
আপনি একক প্রবেশের জন্য সমস্ত সূচকগুলি পেতে এটি একটি ওলাইনার হিসাবে ব্যবহার করতে পারেন। দক্ষতার জন্য কোনও গ্যারান্টি নেই, যদিও আমি ল্যাম্বডা বলা হয় তার সংখ্যা কমাতে সেট (ক) ব্যবহার করেছিলাম।
তালিকার এল তালিকায় এক্সের সূচক সন্ধান করা হচ্ছে:
idx = L.index(x) if (x in L) else -1
পাইথন তালিকাগুলি শূন্য-ভিত্তিক হওয়ায় আমরা জিপ অন্তর্নির্মিত ফাংশনটি নিম্নরূপ ব্যবহার করতে পারি:
>>> [i for i,j in zip(range(len(haystack)), haystack) if j == 'needle' ]
যেখানে "খড়খড়ি" প্রশ্নের তালিকায় রয়েছে এবং "সুই" হ'ল আইটেমটি অনুসন্ধান করা উচিত।
(দ্রষ্টব্য: এখানে আমরা সূচকগুলি পেতে i ব্যবহার করে পুনরাবৃত্তি করছি, তবে আমাদের যদি আইটেমগুলিতে ফোকাস করার প্রয়োজন হয় তবে আমরা জেতে যেতে পারি))
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 ব্যবহার করুন । নিম্নলিখিতটি আপনি যেভাবে এটি প্রয়োগ করবেন তা নিম্নলিখিত Following
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)
আমি তার জন্য কৃতজ্ঞ তাই গণনাটি ঠিক কি করে? । এটি আমাকে বুঝতে সাহায্য করেছিল।
আপনি যদি একবার সূচক খুঁজতে চলেছেন তবে "সূচী" পদ্ধতিটি ব্যবহার করা ভাল। তবে আপনি যদি আপনার ডেটা একাধিকবার অনুসন্ধান করতে যাচ্ছেন তবে আমি বাইসেক্ট মডিউলটি ব্যবহার করার পরামর্শ দিচ্ছি । মনে রাখবেন যে বাইসেক্ট মডিউল ডেটা ব্যবহার করে অবশ্যই বাছাই করা উচিত। সুতরাং আপনি একবার ডেটা সাজান এবং তারপরে আপনি দ্বিখণ্ডিত ব্যবহার করতে পারেন। ব্যবহার দ্বিখণ্ডিত করা আমার মেশিনে মডিউল দ্রুত সূচক পদ্ধতি ব্যবহার করে চেয়ে 20 বার সম্পর্কে।
পাইথন ৩.৮ এবং তারপরে সিনট্যাক্স ব্যবহার করে কোডের একটি উদাহরণ এখানে দেওয়া হয়েছে:
import bisect
from timeit import timeit
def bisect_search(container, value):
return (
index
if (index := bisect.bisect_left(container, value)) < len(container)
and container[index] == value else -1
)
data = list(range(1000))
# value to search
value = 666
# times to test
ttt = 1000
t1 = timeit(lambda: data.index(value), number=ttt)
t2 = timeit(lambda: bisect_search(data, value), number=ttt)
print(f"{t1=:.4f}, {t2=:.4f}, diffs {t1/t2=:.2f}")
আউটপুট:
t1=0.0400, t2=0.0020, diffs t1/t2=19.60
এটি অসংখ্য উত্তরে উল্লেখ করা হয়েছে যে বিল্ট-ইন পদ্ধতির list.index(item)
পদ্ধতিটি একটি ও (এন) অ্যালগরিদম। আপনার যদি একবার এটি সম্পাদন করতে হয় তবে এটি ঠিক আছে। তবে যদি আপনাকে বেশ কয়েকবার উপাদানগুলির সূচকগুলি অ্যাক্সেসের প্রয়োজন হয় তবে প্রথমে আইটেম-ইনডেক্স জোড়গুলির একটি অভিধান (ও (এন)) তৈরি করা আরও গুরুত্বপূর্ণ, এবং তারপরে আপনার প্রয়োজন অনুসারে ও (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]
@ টেরিএ দ্বারা নির্দেশিত হিসাবে, অনেক উত্তর কীভাবে একটি সূচক খুঁজে পেতে হয় তা নিয়ে আলোচনা করে ।
more_itertools
একটি তৃতীয় পক্ষের গ্রন্থাগার যা একটি পুনরাবৃত্তযোগ্যের মধ্যে একাধিক সূচী সনাক্ত করার সরঞ্জাম সহ সরঞ্জামযুক্ত library
প্রদত্ত
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
।
অভিধান ব্যবহার করে প্রথমে তালিকাটি প্রক্রিয়া করুন এবং তারপরে সূচিটি যুক্ত করুন
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]
আমার মতে এটি ["foo", "bar", "baz"].index("bar")
ভাল তবে এটি যথেষ্ট নয়! কারণ যদি "বার" ValueError
অভিধানে না থাকে, উত্থাপিত হয় o সুতরাং আপনি এই ফাংশনটি ব্যবহার করতে পারেন:
def find_index(arr, name):
try:
return arr.index(name)
except ValueError:
return -1
if __name__ == '__main__':
print(find_index(["foo", "bar", "baz"], "bar"))
এবং ফলাফল:
1
এবং যদি নামটি আরারে না থাকে তবে ফাংশনটি -1 প্রদান করে example উদাহরণস্বরূপ:
মুদ্রণ (Find_index (["foo", "বার", "বাজ"], "fooo"))
-1
l = [1, 2]; find_index(l, 3)
ফিরে আসবে -1
এবং l[find_index(l, 3)]
ফিরে আসবে 2
। -1 ফিরিয়ে দেওয়া খারাপ জিনিস, কেবল কোনও কিছুই ফেরান না।
"bar"
, [2] সমস্ত সূচক"bar"
?