একটি তালিকায় একটি আইটেমের সূচি সন্ধান করা


3170

তালিকার একটি তালিকা ["foo", "bar", "baz"]এবং একটি আইটেম দেওয়া হয়েছে "bar", আমি 1পাইথনে এটির সূচক ( ) কীভাবে পাব ?


6
আপনি কি ফিরে যাচ্ছেন: [1] একাধিক উদাহরণ থাকলে সর্বনিম্ন সূচক "bar", [2] সমস্ত সূচক "bar"?
5gǻňạcểơửṩ

4
ক) তালিকায় থাকা আইটেমটি কি গ্যারান্টিযুক্ত, অন্যথায় আমাদের কীভাবে ত্রুটি কেস পরিচালনা করা উচিত? (কোনওটিই ফিরিয়ে আনুন / মান বাড়ান না) খ) তালিকাভুক্তিগুলি কি অনন্য হওয়ার গ্যারান্টিযুক্ত, এবং আমরা কি কোনও ম্যাচের প্রথম সূচক, বা সমস্ত সূচকগুলি ফিরিয়ে দেব?
স্মি

নম্পি একীকরণের সাথে উত্তরগুলি দেখুন, পাইপন তালিকার তুলনায় নিম্পী অ্যারেগুলি আরও বেশি দক্ষ। যদি তালিকাটি সংক্ষিপ্ত হয় তবে পাইথন তালিকা থেকে এটির অনুলিপি তৈরি করতে কোনও সমস্যা নেই, যদি তা না হয় তবে সম্ভবত আপনাকে প্রথমে অসাধারণ অ্যারেতে উপাদানগুলি সংরক্ষণ করার বিষয়টি বিবেচনা করা উচিত।
অ্যাথানাসিওস

উত্তর:


4471
>>> ["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

আইটেমটি তালিকায় উপস্থিত নাও থাকতে পারে, আপনারও উচিত

  1. প্রথমে এর জন্য পরীক্ষা করুন item in my_list(পরিষ্কার, পঠনযোগ্য পদ্ধতি), বা
  2. indexএকটি try/exceptব্লকে কলটি জড়ান যা ক্যাচ করে ValueError(সম্ভবত দ্রুততর, কমপক্ষে অনুসন্ধানের তালিকাটি দীর্ঘ এবং আইটেমটি সাধারণত উপস্থিত থাকে))

20
সূচক প্রথম আইটেমটি প্রদান করে যার মান "বার"। যদি "বার" তালিকায় দু'বার উপস্থিত থাকে তবে আপনি দ্বিতীয় "বার" এর জন্য কীটি কখনই খুঁজে পাবেন না। ডকুমেন্টেশন দেখুন: ডকস.পিথন.আর
/

2
আপনি যদি কেবলমাত্র একটি উপাদান (প্রথম) অনুসন্ধান করে থাকেন তবে আমি দেখতে পেলাম যে index()পূর্ণসংখ্যার তালিকার বিরুদ্ধে তালিকার বোঝাপড়ার চেয়ে 90% এর নিচে।
slybloty

তালিকাটি দীর্ঘ দীর্ঘ হলে কোন তথ্য কাঠামো ব্যবহার করা উচিত?
izhang05

@ আইজং: উপাদানগুলি হ্যাশযোগ্য এবং তালিকার অবস্থান বিবেচনায় থাকলে Some উপাদান -> list_index has ডকের মতো কিছু সহায়ক সূচক।
অ্যালেক্স কভেন্ট্রি

898

পাইথন শেখার ক্ষেত্রে একটি জিনিস যা ইন্টারেক্টিভ সহায়তা ফাংশনটি ব্যবহার করে তা হ'ল:

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

class list(object)
 ...

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

যা আপনাকে প্রায়শই সেই পদ্ধতির দিকে নিয়ে যায় যা আপনি সন্ধান করছেন।


2
বিপিথন হ'ল একটি ইন্টারেক্টিভ ফ্যাশনে ডক্সটি পড়ার একটি দুর্দান্ত ব্যবহারকারী-বান্ধব উপায়।
goetzc

@ ডেভিডাভর হ্যাঁ, তবে তারপরে আমাদের মধ্যে যারা বাকী আছেন কেবলমাত্র সহায়তা ডক্সের মাধ্যমে স্ক্রোল করার পরিবর্তে এটি গুগল করতে চান তাদের বিকল্পগুলির এই সুন্দর, কেন্দ্রীয়, র‌্যাঙ্কড সেটটি না থাকতে পারে। :)
হনকবয়

555

বেশিরভাগ উত্তরে ব্যাখ্যা করা হয় যে কীভাবে একটি একক সূচি সন্ধান করতে হয় , তবে আইটেমটি তালিকায় একাধিকবার থাকলে তাদের পদ্ধতিগুলি একাধিক সূচক ফেরত দেয় না। ব্যবহার 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

আমার জন্য সূচী-ভিত্তিক পদ্ধতির তুলনায় গণনাটি আরও ভাল কাজ করে, যেহেতু আমি 'স্টার্টউইথ' ব্যবহার করে স্ট্রিংয়ের সূচকগুলি সংগ্রহ করতে চাইছি এবং আমার একাধিক উপস্থিতি সংগ্রহ করা দরকার Or বা "শুরুর সাথে" সূচক ব্যবহার করার উপায় আছে যা আমি অনুমান করতে পারিনি
টুপেলো থিসলেহেড

3
আমার হাতে, গণনা সংস্করণ ধারাবাহিকভাবে সামান্য দ্রুত হয়। উপরের পরিমাপটি পোস্ট হওয়ার পরে কিছু বাস্তবায়ন বিশদ পরিবর্তন হতে পারে।
অ্যালেক্স কভেন্ট্রি

2
: ইতিমধ্যে '11 সাল থেকে উত্তর দেওয়া হয়েছিল stackoverflow.com/questions/6294179/...
Cristik


132

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

2
এবং তালিকায় উপস্থিত না থাকলে?
পিটার মর্টেনসেন

1
অ-অস্তিত্বের আইটেমটি ValueError উত্থাপন করবে
নাম জি ভিইউ

1
এই উত্তর ভাল এখানে মাপসই করা হবে stackoverflow.com/questions/6294179/...
Cristik

86

উপাদানটি তালিকায় না থাকলে একটি সমস্যা দেখা দেবে। এই ফাংশনটি বিষয়টি পরিচালনা করে:

# 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


58

আপনি যে উপাদানটি অনুসন্ধান করছেন তা তালিকায় রয়েছে কিনা তা পরীক্ষা করতে আপনাকে একটি শর্ত সেট করতে হবে

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

1
এটি আমাদের চেষ্টা এড়াতে সহায়তা করে!
devssh

তবে এটি জটিলতা দ্বিগুণ করতে পারে। কেউ চেক করেছেন?
stefanct

@ স্টেফ্যান্ট সময় জটিলতা এখনও লিনিয়ার তবে এটি তালিকার দ্বিগুণ পুনরাবৃত্তি হবে।
ডার্কনেস

নিবন্ধন করুন এমনকি পেডেন্টালভাবে এটি জটিলতার একই ক্রম হলেও দুবার পুনরাবৃত্তি করা অনেক ব্যবহারের ক্ষেত্রে মারাত্মক অসুবিধা হতে পারে এইভাবে আমি এটিকে সামনে এনেছি। এবং আমরা এখনও উত্তরটি জানি না ...
স্টেফ্যান্ট

44

এখানে প্রস্তাবিত সমস্ত ফাংশন সহজাত ভাষার আচরণের পুনরুত্পাদন করে তবে যা চলছে তা অস্পষ্ট করে।

[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

ভাষা যদি আপনি নিজে যা চান তা করার পদ্ধতি সরবরাহ করে তবে ব্যতিক্রম হ্যান্ডলিংয়ের সাথে একটি ফাংশন লিখুন কেন?


9
3 য় পদ্ধতি তালিকার দ্বিগুণ পুনরুক্তি করে, তাই না?
এরিক ডুমিনিল

পুনঃ: "এখানে প্রস্তাবিত সমস্ত কার্যাদি" : সম্ভবত লেখার সময়, তবে এটি এখনও সত্য কিনা তা দেখার জন্য আপনার নতুন উত্তরগুলি পরীক্ষা করা উচিত।
পিটার মর্টেনসেন

41

আপনি যদি সমস্ত সূচক চান, তবে আপনি 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),)

এটি পরিষ্কার, পাঠযোগ্য সমাধান।


4
স্ট্রিংয়ের তালিকা, অ-সংখ্যাসূচক বস্তুর তালিকা ইত্যাদির কী ...?
ল্যারিক্স ডেসিডুয়া

1
এই উত্তর ভাল এখানে পোস্ট করা উচিত stackoverflow.com/questions/6294179/...
Cristik

1
এটি আমি সবচেয়ে ভাল পড়েছি। পাইপথন তালিকার চেয়ে নপি অ্যারেগুলি আরও কার্যকর। যদি তালিকাটি সংক্ষিপ্ত হয় তবে পাইথন তালিকা থেকে এটির অনুলিপি তৈরি করতে কোনও সমস্যা নেই, যদি তা না হয় তবে সম্ভবত বিকাশকারীকে প্রথমে অসাধারণ অ্যারেতে উপাদানগুলি সংরক্ষণ করার বিষয়টি বিবেচনা করা উচিত।
অ্যাথানাসিওস

35

পাইথনে এটি থাকা একটি তালিকা প্রদত্ত কোনও আইটেমের সূচি সন্ধান করা

তালিকার একটি তালিকা ["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 এবং এগুলি বেশিরভাগ ক্ষেত্রে পার্সিং (এবং আইডলের ক্ষেত্রে ইউআই) ব্যবহার করা হয়।

যদিও এর জন্য ব্যবহারের ক্ষেত্রে রয়েছে, তারা মোটামুটি অস্বাভাবিক। যদি আপনি নিজেকে এই উত্তরটির সন্ধান করতে দেখেন তবে নিজেকে জিজ্ঞাসা করুন আপনি কী করছেন তা আপনার ব্যবহারের ক্ষেত্রে ভাষার দ্বারা সরবরাহিত সরঞ্জামগুলির মধ্যে সর্বাধিক সরাসরি ব্যবহার।



21

সমস্ত উপস্থিতি এবং এক বা একাধিক (অভিন্ন) আইটেমের তালিকায় থাকা

গণনা (আলিস্ট) দিয়ে আপনি প্রথম উপাদানটি (এন) সংরক্ষণ করতে পারেন যা তালিকার সূচী হয় যখন এলিমেন্টটি আপনি যা পছন্দ করেন তার সমান হয়।

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

1
এই উত্তর ভাল এখানে পোস্ট করা উচিত stackoverflow.com/questions/6294179/...
Cristik

16

সহজভাবে আপনি যেতে পারেন

a = [['hand', 'head'], ['phone', 'wallet'], ['lost', 'stock']]
b = ['phone', 'lost']

res = [[x[0] for x in a].index(y) for y in b]

16

অন্য একটি বিকল্প

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

1
এই উত্তর ভাল এখানে পোস্ট করা উচিত stackoverflow.com/questions/6294179/...
Cristik

15

এবং এখন সম্পূর্ণ ভিন্ন কিছু...

... সূচক পাওয়ার আগে আইটেমটির অস্তিত্ব নিশ্চিত করার মতো। এই পদ্ধতির সম্পর্কে দুর্দান্ত জিনিস হ'ল ফাংশনটি সর্বদা সূচকগুলির একটি তালিকা প্রদান করে - এমনকি এটি খালি তালিকা হলেও। এটি স্ট্রিংগুলির সাথেও কাজ করে।

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

এবং এখন, এই প্রশ্ন এবং সমস্ত উত্তরগুলি পর্যালোচনা করার পরে, আমি বুঝতে পারি যে এফএমসি তার আগের উত্তরটিতে ঠিক একই পরামর্শ দিয়েছে । আমি মূলত এই প্রশ্নের উত্তর দিয়েছিলাম এমন সময়, আমি দেখিনি সেই উত্তরটিও পাইনি, কারণ আমি তা বুঝতে পারি নি। আমি আশা করি যে আমার আরও কিছু ভারবস উদাহরণটি বুঝতে সহায়তা করবে।

যদি উপরে একক কোডের লাইনটি এখনও আপনার কাছে বোঝায় না , তবে আমি আপনাকে গুগলের 'অজগর তালিকার বোঝাপড়া'র জন্য অত্যন্ত পরামর্শ দিচ্ছি এবং নিজেকে পরিচিত করতে কয়েক মিনিট সময় নিচ্ছি। কোডটি বিকাশের জন্য পাইথন ব্যবহার করে এটি আনন্দিত করে এমন অনেক শক্তিশালী বৈশিষ্ট্যগুলির মধ্যে এটি একটি।


12

এফএমসি এবং ব্যবহারকারী 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]}
>>> 

আপনি একক প্রবেশের জন্য সমস্ত সূচকগুলি পেতে এটি একটি ওলাইনার হিসাবে ব্যবহার করতে পারেন। দক্ষতার জন্য কোনও গ্যারান্টি নেই, যদিও আমি ল্যাম্বডা বলা হয় তার সংখ্যা কমাতে সেট (ক) ব্যবহার করেছিলাম।


1
এই উত্তর ভাল এখানে পোস্ট করা উচিত stackoverflow.com/questions/6294179/...
Cristik

10

এই সমাধানটি অন্যের মতো শক্তিশালী নয়, তবে আপনি যদি শিক্ষানবিশ হন এবং কেবল forলুপগুলি সম্পর্কে জানেন তবে ভ্যালুয়েরর এড়ানোর সময় কোনও আইটেমের প্রথম সূচকটি পাওয়া সম্ভব:

def find_element(p,t):
    i = 0
    for e in p:
        if e == t:
            return i
        else:
            i +=1
    return -1

9

তালিকার এল তালিকায় এক্সের সূচক সন্ধান করা হচ্ছে:

idx = L.index(x) if (x in L) else -1

4
এটি অ্যারেকে দু'বার পুনরুক্ত করে, ফলে এটি বৃহত অ্যারেগুলির জন্য পারফরম্যান্স সমস্যার সমাধান করতে পারে।
ক্রিশ্চিক

একমত। যদি তালিকাগুলি যথেষ্ট দীর্ঘ হয় তবে আমি অন্য কিছু চাই। যদিও ছোট থেকে মাঝারি আকারের তালিকার জন্য বড় চুক্তি হওয়া উচিত নয়।
কেতন

5

পাইথন তালিকাগুলি শূন্য-ভিত্তিক হওয়ায় আমরা জিপ অন্তর্নির্মিত ফাংশনটি নিম্নরূপ ব্যবহার করতে পারি:

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

যেখানে "খড়খড়ি" প্রশ্নের তালিকায় রয়েছে এবং "সুই" হ'ল আইটেমটি অনুসন্ধান করা উচিত।

(দ্রষ্টব্য: এখানে আমরা সূচকগুলি পেতে i ব্যবহার করে পুনরাবৃত্তি করছি, তবে আমাদের যদি আইটেমগুলিতে ফোকাস করার প্রয়োজন হয় তবে আমরা জেতে যেতে পারি))


3
[আমি আমার জন্য, গণিতে গণনা করা (খড়ের কাঁটা) যদি জ == 'সুই'] আরও কমপ্যাক্ট এবং পাঠযোগ্য, আমার মনে হয় think
জিওভান্নি জি পিওয়াই

5
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


4

index()আইটেমটি পাওয়া না গেলে পাইথন পদ্ধতি ত্রুটি ছুঁড়ে দেয়। সুতরাং পরিবর্তে আপনি এটিকে indexOf()জাভাস্ক্রিপ্টের ফাংশনের মতো করতে পারবেন যা -1আইটেমটি পাওয়া না গেলে ফিরে আসে :

try:
    index = array.index('search_keyword')
except ValueError:
    index = -1

5
যাইহোক, জাভাস্ক্রিপ্টের দর্শন রয়েছে যে ত্রুটিগুলির চেয়ে অদ্ভুত ফলাফলগুলি আরও ভাল, সুতরাং এটি -1 ফিরে আসার অর্থ বোধ করে তবে পাইথনে এটি বাগের উপর নজর রাখা শক্ত করে তুলতে পারে, যেহেতু -1 তালিকার শেষে থেকে কোনও আইটেম ফেরত দেয়।
Sapphire_Brick

3

এটির আরও কার্যকরী উত্তর রয়েছে।

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

1
এই উত্তরটি বাড়িতে Scala/ ক্রিয়ামূলক-প্রোগ্রামিং উত্সাহীদের জন্য অনুভূত হয়
y2k-shubham

3

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

2

আমার মতো অন্য ভাষা থেকে আসা যারা, তাদের জন্য সম্ভবত একটি সাধারণ লুপের সাহায্যে এটি বোঝা এবং ব্যবহার করা আরও সহজ:

mylist = ["foo", "bar", "baz", "bar"]
newlist = enumerate(mylist)
for index, item in newlist:
  if item == "bar":
    print(index, item)

আমি তার জন্য কৃতজ্ঞ তাই গণনাটি ঠিক কি করে? । এটি আমাকে বুঝতে সাহায্য করেছিল।


2

আপনি যদি একবার সূচক খুঁজতে চলেছেন তবে "সূচী" পদ্ধতিটি ব্যবহার করা ভাল। তবে আপনি যদি আপনার ডেটা একাধিকবার অনুসন্ধান করতে যাচ্ছেন তবে আমি বাইসেক্ট মডিউলটি ব্যবহার করার পরামর্শ দিচ্ছি । মনে রাখবেন যে বাইসেক্ট মডিউল ডেটা ব্যবহার করে অবশ্যই বাছাই করা উচিত। সুতরাং আপনি একবার ডেটা সাজান এবং তারপরে আপনি দ্বিখণ্ডিত ব্যবহার করতে পারেন। ব্যবহার দ্বিখণ্ডিত করা আমার মেশিনে মডিউল দ্রুত সূচক পদ্ধতি ব্যবহার করে চেয়ে 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

1

যদি পারফরম্যান্স উদ্বেগজনক হয়:

এটি অসংখ্য উত্তরে উল্লেখ করা হয়েছে যে বিল্ট-ইন পদ্ধতির 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]

1

@ টেরিএ দ্বারা নির্দেশিত হিসাবে, অনেক উত্তর কীভাবে একটি সূচক খুঁজে পেতে হয় তা নিয়ে আলোচনা করে ।

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


0

অভিধান ব্যবহার করে প্রথমে তালিকাটি প্রক্রিয়া করুন এবং তারপরে সূচিটি যুক্ত করুন

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]

-1

আমার মতে এটি ["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


1
এটি ব্যবহার করবেন না কারণ l = [1, 2]; find_index(l, 3)ফিরে আসবে -1এবং l[find_index(l, 3)]ফিরে আসবে 2। -1 ফিরিয়ে দেওয়া খারাপ জিনিস, কেবল কোনও কিছুই ফেরান না।
ড্যানিয়েল স্ট্রাকাবোস্কো

-১ একটি চুক্তি যা আপনি চাইলে ফিরে আসতে পারেন তবে আপনার প্রোগ্রামগুলিতে কম কিছু ব্যবহার করার চেষ্টা করবেন না কারণ অ্যান্ড্রয়েড এবং পিএইচপি ওয়েবসাইটগুলির মতো অন্যান্য প্রোগ্রামগুলির সাথে আপনার প্রোগ্রামের যোগাযোগের ক্ষেত্রে কেউই বা নাল প্রোগ্রামের বিরতি সৃষ্টি করতে পারে উদাহরণস্বরূপ আপনি জেএসএন এ নਾਲ ফিরে আসতে পারেন এবং আপনার ওয়েবসাইটের ফোন অ্যাপ্লিকেশনটি বন্ধ হবে বা ত্রুটি 500 (অভ্যন্তরীণ সার্ভার ত্রুটি) ফিরিয়ে দেবে।
নবনেটস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.