পাইথন: তালিকায় সন্ধান করুন


583

আমি এটি জুড়ে এসেছি:

item = someSortOfSelection()
if item in myList:
    doMySpecialFunction(item)

তবে কখনও কখনও এটি আমার সমস্ত আইটেমগুলির সাথে কাজ করে না, যেন তারা তালিকায় স্বীকৃতি পায় না (যখন এটি স্ট্রিংয়ের একটি তালিকা)।

এই একটি তালিকা থেকে একটি আইটেম খুঁজে বের করার সবচেয়ে 'pythonic' উপায় আছে কি: if x in l:?


3
এটি পুরোপুরি সূক্ষ্ম এবং আইটেমের ভিতরে থাকা উপাদানগুলির মধ্যে একটির সমান হলে কাজ করা উচিত myList
নিক্লাস বি।

1
আপনি কি বোঝাতে চেয়েছিলেন যে জিনিসগুলি করার ভাল উপায় ছিল? আমার বেশ কয়েকটি পরীক্ষায়, সম্ভবত শ্বেত স্পেস ছিল এবং লাইন ফিডগুলি আন্তঃসংযোগ করছে ... আমি কেবল নিশ্চিত হতে চেয়েছিলাম "সন্ধানী তালিকায়" প্রয়োগ করার ভাল উপায় (সাধারণভাবে)
স্টিফেন রোল্যান্ড

উত্তর:


1173

আপনার প্রথম প্রশ্নের হিসাবে: সেই কোডটি পুরোপুরি ঠিক আছে এবং যদি itemভিতরের উপাদানগুলির মধ্যে একটির সমান হয় তবে তা কাজ করা উচিত myList। হতে পারে আপনি এমন একটি স্ট্রিং সন্ধান করার চেষ্টা করেছেন যা আইটেমগুলির মধ্যে একটির সাথে ঠিক মেলে না বা সম্ভবত আপনি একটি ফ্লোট মান ব্যবহার করছেন যা অসম্পূর্ণতায় ভুগছে।

আপনার দ্বিতীয় প্রশ্ন হিসাবে: তালিকাগুলিতে জিনিসগুলি "সন্ধান" করতে পারলে আসলে বেশ কয়েকটি সম্ভাব্য উপায় রয়েছে।

ভিতরে কিছু আছে কিনা তা পরীক্ষা করা হচ্ছে

আপনি যে বর্ণনাটি বর্ণনা করেছেন এটি এটি: তালিকার অভ্যন্তরে কিছু রয়েছে কিনা তা পরীক্ষা করা হচ্ছে। আপনি যেমন জানেন, আপনি তার জন্য inঅপারেটরটি ব্যবহার করতে পারেন :

3 in [1, 2, 3] # => True

একটি সংগ্রহ ফিল্টার করছে

অর্থাত, একটি নির্দিষ্ট শর্ত পূরণ করে এমন ক্রমে সমস্ত উপাদান সন্ধান করা। আপনি তার জন্য তালিকা বোঝার বা জেনারেটরের এক্সপ্রেশন ব্যবহার করতে পারেন:

matches = [x for x in lst if fulfills_some_condition(x)]
matches = (x for x in lst if x > 6)

পরেরটি এমন একটি জেনারেটর ফিরিয়ে দেবে যা আপনি কল্পনা করতে পারেন এমন অলস তালিকার একটি তালিকা যা কেবল এটির মাধ্যমে পুনরাবৃত্তি হওয়ার সাথে সাথেই নির্মিত হবে। যাইহোক, প্রথমটি হুবহু সমান

matches = filter(fulfills_some_condition, lst)

পাইথন ২. এখানে আপনি কর্মক্ষেত্রে উচ্চ-অর্ডার ফাংশন দেখতে পারেন। পাইথন 3 এ, filterকোনও তালিকা ফিরিয়ে দেয় না, তবে জেনারেটরের মতো বস্তু।

প্রথম ঘটনাটি সন্ধান করা

যদি আপনি কেবল শর্তের সাথে মেলে এমন প্রথম জিনিসটি চান (তবে এটি এখনও কী তা আপনি জানেন না) তবে লুপের জন্য সম্ভবত সম্ভবত এটির elseধারাটি ব্যবহার করা ভাল, যা সত্যই সুপরিচিত নয়। আপনি ব্যবহার করতে পারেন

next(x for x in lst if ...)

যা প্রথম ম্যাচটি ফিরিয়ে দেবে বা StopIterationযদি কিছু না পাওয়া যায় তবে একটি বাড়িয়ে তুলবে । বিকল্পভাবে, আপনি ব্যবহার করতে পারেন

next((x for x in lst if ...), [default value])

কোনও আইটেমের অবস্থান সন্ধান করা হচ্ছে

তালিকার জন্য, এর রয়েছে indexপদ্ধতি যে কখনও কখনও দরকারী যদি আপনি জানতে চান হতে পারে যেখানে একটি নির্দিষ্ট উপাদান তালিকা রয়েছে:

[1,2,3].index(2) # => 1
[1,2,3].index(4) # => ValueError

তবে নোট করুন যে আপনার যদি সদৃশ থাকে তবে .indexসর্বদা সর্বনিম্ন সূচকটি প্রদান করে: ......

[1,2,3,2].index(2) # => 1

যদি সেখানে সদৃশ থাকে এবং আপনি সমস্ত সূচক চান তবে আপনি তার enumerate()পরিবর্তে ব্যবহার করতে পারেন :

[i for i,x in enumerate([1,2,3,2]) if x==2] # => [1, 3]

10
স্টিফেন: যাক আমাকে ভিন্নরূপে বা অন্য কথায়: if x in listহয় না যে মানুষ একটি বিল্ট-ইন ফাংশন হচ্ছে না অভিযোগ। তারা এই অভিযোগ নিয়ে অভিযোগ করেন যে কোনও শর্তের সাথে মেলে এমন কোনও তালিকার প্রথম ঘটনাটি খুঁজে পাওয়ার সুস্পষ্ট উপায় নেই। তবে আমার উত্তরে বলা হয়েছে, এর next()জন্য (আব) ব্যবহার করা যেতে পারে।
নিক্লাস বি।

3
@ স্টেফেন: দ্বিতীয়টি একটি টুপল তৈরি করে না, তবে একটি জেনারেটর (যা মূলত এখনও নির্মিত হয়নি এমন একটি তালিকা। আপনি যদি ফলাফলটি একবারে ব্যবহার করতে চান তবে একটি জেনারেটর সাধারণত পছন্দনীয়। তবে আপনি যদি পরে তৈরির সংগ্রহটি বেশ কয়েকবার ব্যবহার করতে চান তবে প্রথমে স্পষ্ট তালিকা তৈরি করার পরামর্শ দেওয়া হচ্ছে। আমার আপডেটটি দেখুন, এখন এটি আরও কিছুটা ভাল কাঠামোগত :)
নিক্লাস বি।

26
আপনার "প্রথম ঘটনা সন্ধান" উদাহরণটি সোনার is [list comprehension...][0]পদ্ধতির চেয়ে
অজগরটিকে

4
আমি পাইথনের 'কার্যকরী' সক্ষমতা নিয়ে আরও বেশি করে বিচ্ছিন্ন। হ্যাসকেলে ডেটা.লিস্ট মডিউলে ফাংশন রয়েছে যা ঠিক তা করে doing তবে অজগরটিতে এটি নয় এবং এটি একটি গ্রন্থাগার তৈরি করা ছোট যা আপনাকে বার বার একই যুক্তিকে পুনরায় প্রতিস্থাপন করতে হবে। কি অপচয় ...
ব্যবহারকারীর 686895

3
এটা চমৎকার যদি একটি kwarg ছিল হবে index()নামক keyযে ভালো কাজ keyদ্বারা গৃহীত max(); উদাহরণস্বরূপ: index(list, key=is_prime)
কর্ট 3 ই

189

আপনি যদি কোনও উপাদান খুঁজে পেতে চান বা Noneডিফল্ট ব্যবহার করতে চান তবে আইটেমটি তালিকায় পাওয়া না গেলে এটি nextউত্থিত হবে না StopIteration:

first_or_default = next((x for x in lst if ...), None)

1
nextপ্রথম প্যারামিটার হিসাবে একটি পুনরাবৃত্তি গ্রহণ করে এবং একটি তালিকা / টিপল একটি পুনরাবৃত্তকারী নয়। সুতরাং এটি docs.python.org/3/library/function.html#nextfirst_or_default = next(iter([x for x in lst if ...]), None) দেখতে হবে
ডেভি

7
@Devy: ঠিক আছে, কিন্তু যে (x for x in lst if ...)তালিকা উপর একটি জেনারেটর lst(যা হয় কোনো ইটারেটরে)। যদি আপনি তা করেন তবে আপনাকে next(iter([x for x in lst if ...]), None)তালিকাটি তৈরি [x for x in lst if ...]করতে হবে যা অনেক বেশি ব্যয়বহুল অপারেশন হবে।
এরল্যান্ড গ্রাফ

1
একটি ফাংশন সংজ্ঞায়িত করতে এখানে একটি বিমূর্ততা রয়েছে। কেবল ifএকটি ল্যাম্বডায় বুলিয়ান এক্সপেনশনকে আবদ্ধ করুন এবং find(fn,list)জেনারেটর কোডটি অবলম্বন না করে আপনি সাধারণত লিখতে পারেন ।
সেমিওম্যান্ট

22

যদিও নিক্লাস বি এর উত্তরটি বেশ বিস্তৃত, যখন আমরা কোনও তালিকার কোনও আইটেম সন্ধান করতে চাই তখন এটি সূচক পেতে কখনও কখনও কার্যকর হয়:

next((i for i, x in enumerate(lst) if [condition on x]), [default value])

11

প্রথম ঘটনাটি সন্ধান করা

এটির জন্য একটি রেসিপি রয়েছে itertools:

def first_true(iterable, default=False, pred=None):
    """Returns the first true value in the iterable.

    If no true value is found, returns *default*

    If *pred* is not None, returns the first item
    for which pred(item) is true.

    """
    # first_true([a,b,c], x) --> a or b or c or x
    # first_true([a,b], x, f) --> a if f(a) else b if f(b) else x
    return next(filter(pred, iterable), default)

উদাহরণস্বরূপ, নিম্নলিখিত কোডটি একটি তালিকায় প্রথম বিজোড় সংখ্যাটি আবিষ্কার করে:

>>> first_true([2,3,4,5], None, lambda x: x%2==1)
3  

6

অন্য বিকল্প: আপনি কোনও আইটেমের সাথে তালিকায় রয়েছেন কিনা তা পরীক্ষা করতে পারেন if item in list:তবে এটি অর্ডার হে (এন)। আপনি যদি আইটেমের বড় তালিকাগুলি নিয়ে কাজ করছেন এবং আপনার তালিকার একজন সদস্য কিনা তা আপনাকে যা জানতে হবে তা হল, আপনি প্রথমে তালিকাটিকে একটি সেটে রূপান্তর করতে পারেন এবং ধ্রুবক সময় সেট দেখার সুযোগ নিতে পারেন :

my_set = set(my_list)
if item in my_set:  # much faster on average than using a list
    # do something

প্রতিটি ক্ষেত্রে সঠিক সমাধান হতে চলেছে না, তবে কিছু ক্ষেত্রে এটি আপনাকে আরও ভাল পারফরম্যান্স দিতে পারে।

মনে রাখবেন যে দিয়ে সেটটি তৈরি set(my_list)করাও ও (এন), সুতরাং আপনার যদি একবার এটি করতে হয় তবে এটি এইভাবে করা কোনও দ্রুত নয় isn't আপনার যদি বার বার সদস্যপদটি পরীক্ষা করার প্রয়োজন হয় তবে প্রাথমিক সেট তৈরির পরে এটি প্রতিটি অনুসন্ধানের জন্য ও (1) হবে।


4

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

  1. যদি তালিকার উপাদানটি কোনও আইটেমের সমান হয় ('উদাহরণ' [[একটিতে ',' উদাহরণ ',' দুটি '] তে থাকে)):

    if item in your_list: some_function_on_true()

    'প্রাক্তন' তে ['এক', 'প্রাক্তন', 'দুই'] => সত্য

    ['এক', 'প্রাক্তন', 'দুই'] তে 'প্রাক্তন' = = মিথ্যা

  2. যদি তালিকার উপাদানটি কোনও আইটেমের মতো হয় ('প্রাক্তন' [[এক, 'উদাহরণ', 'দুটি'] বা 'উদাহরণ_1' এ ['এক', 'উদাহরণ', 'দু''তে রয়েছে)):

    matches = [el for el in your_list if item in el]

    অথবা

    matches = [el for el in your_list if el in item]

    তারপরে len(matches)প্রয়োজনে তাদের পরীক্ষা করুন বা পড়ুন।


3

সংজ্ঞা এবং ব্যবহার

count()পদ্ধতি নির্দিষ্ট করা মানের সঙ্গে উপাদানের সংখ্যা ফেরৎ।

বাক্য গঠন

list.count(value)

উদাহরণ:

fruits = ['apple', 'banana', 'cherry']

x = fruits.count("cherry")

প্রশ্নের উদাহরণ:

item = someSortOfSelection()

if myList.count(item) >= 1 :

    doMySpecialFunction(item)

2
এটি কি খুব দীর্ঘ তালিকায় দক্ষ? দশ লক্ষের তালিকা বলবে?
3kstc

1
আমি নিশ্চিত না !!!
জোসেফ

1

list.index(x)যেটি এক্সের সূচকটি তালিকায় পাওয়া যায় তা ফেরত ব্যবহার করে বা #ValueErrorএক্স না পাওয়া গেলে একটি বার্তা প্রদান করে পরিবর্তে আপনি ব্যবহার করতে পারেন list.count(x)যা তালিকার সাথে x এর উপস্থিতির সংখ্যা প্রদান করে (এক্সটি তালিকায় অবশ্যই রয়েছে) বা এটি অন্যথায় 0 প্রদান করে (এক্স এর অনুপস্থিতিতে)। দুর্দান্ত জিনিসটি count()হ'ল এটি আপনার কোডটি ভঙ্গ করে না বা এক্সটি পাওয়া যায় না এর জন্য আপনাকে একটি ব্যতিক্রম ছুঁড়ে দেওয়ার প্রয়োজন হয়


এবং খারাপ জিনিসটি এটি উপাদানকে গণনা করে। উপাদানটি পাওয়া গেলে এটি থেমে থাকে না। কাজেই বড় তালিকাতে পারফরম্যান্স খারাপ
জিন-ফ্রান্সোয়েস ফ্যাব্রে

1

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

পাইথন ৩.৮ এবং তারপরে সিনট্যাক্স ব্যবহার করে কোডের একটি উদাহরণ এখানে দেওয়া হয়েছে:

import bisect
from timeit import timeit

def bisect_search(container, value):
    return (
      (index := bisect.bisect_left(container, value)) < len(container) 
      and container[index] == value
    )

data = list(range(1000))
# value to search
true_value = 666
false_value = 66666

# times to test
ttt = 1000

print(f"{bisect_search(data, true_value)=} {bisect_search(data, false_value)=}")

t1 = timeit(lambda: true_value in data, number=ttt)
t2 = timeit(lambda: bisect_search(data, true_value), number=ttt)

print("Performance:", f"{t1=:.4f}, {t2=:.4f}, diffs {t1/t2=:.2f}")

আউটপুট:

bisect_search(data, true_value)=True bisect_search(data, false_value)=False
Performance: t1=0.0220, t2=0.0019, diffs t1/t2=11.71

0

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.