পাইথনের তালিকায় কিছু (না) রয়েছে কিনা তা আমি কীভাবে পরীক্ষা করব?
সবচেয়ে সস্তা এবং সর্বাধিক পঠনযোগ্য সমাধানটি in
অপারেটরটি (বা আপনার নির্দিষ্ট ক্ষেত্রে, not in
) ব্যবহার করছে। নথিতে উল্লিখিত হিসাবে,
অপারেটরদের in
এবং not in
সদস্যতার জন্য পরীক্ষা। x in s
এর সদস্য True
কিনা x
তা মূল্যায়ন করে
s
এবং False
অন্যথায়। x not in s
প্রত্যাখ্যান ফিরিয়ে দেয় x in s
।
উপরন্তু,
অপারেটরটির not in
বিপরীত সত্য মানটি সংজ্ঞায়িত করা হয় in
।
y not in x
যৌক্তিকভাবে একই not y in x
।
এখানে কিছু উদাহরণ আছে:
'a' in [1, 2, 3]
# False
'c' in ['a', 'b', 'c']
# True
'a' not in [1, 2, 3]
# True
'c' not in ['a', 'b', 'c']
# False
এটি টিউপলসের সাথেও কাজ করে, যেহেতু টিপলগুলি হ্যাশেবল হয় (যে তারাও অপরিবর্তনীয় এই ফলস্বরূপ):
(1, 2) in [(3, 4), (1, 2)]
# True
আরএইচএসে থাকা অবজেক্টটি যদি কোনও __contains__()
পদ্ধতি সংজ্ঞায়িত করে তবে ডকসের তুলনা বিভাগের in
শেষ অনুচ্ছেদে উল্লিখিত হিসাবে এটি অভ্যন্তরীণভাবে এটিকে ডাকবে ।
... in
এবং not in
, এমন ধরণের দ্বারা সমর্থিত যা পুনরাবৃত্তিযোগ্য বা __contains__()
পদ্ধতিটি কার্যকর করে
। উদাহরণস্বরূপ, আপনি এটি করতে পারেন (তবে হওয়া উচিত নয়):
[3, 2, 1].__contains__(1)
# True
in
শর্ট সার্কিট, সুতরাং যদি আপনার উপাদানটি তালিকার শুরুতে থাকে তবে in
দ্রুত মূল্যায়ন করুন:
lst = list(range(10001))
%timeit 1 in lst
%timeit 10000 in lst # Expected to take longer time.
68.9 ns ± 0.613 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
178 µs ± 5.01 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
আপনি যদি তালিকায় কোনও আইটেম আছে কিনা তা পরীক্ষা করে দেখার চেয়ে আরও কিছু করতে চান তবে বিকল্পগুলি রয়েছে:
list.index
কোনও আইটেমের সূচি পুনরুদ্ধার করতে ব্যবহার করা যেতে পারে। যদি সেই উপাদানটির অস্তিত্ব না থাকে তবে একটি ValueError
উত্থাপিত হয়।
list.count
আপনি যদি ঘটনাগুলি গণনা করতে চান তবে ব্যবহার করা যেতে পারে।
এক্সওয়াই সমস্যা: আপনি কি বিবেচনা করেছেন set
?
নিজেকে এই প্রশ্নগুলি জিজ্ঞাসা করুন:
- তালিকার কোনও আইটেম একাধিকবার রয়েছে কিনা তা আপনার চেক করা দরকার?
- এই চেকটি কোনও লুপের ভিতরে করা হয়, বা কোনও ফাংশন বারবার বলা হয়?
- আপনি আপনার তালিকায় যে আইটেমগুলি সংরক্ষণ করছেন তা কি হ্যাশেবল? IOW, আপনি
hash
তাদের সাথে ফোন করতে পারেন ?
আপনি যদি এই প্রশ্নের উত্তর "হ্যাঁ" দেন তবে আপনার set
পরিবর্তে এটি ব্যবহার করা উচিত । ও- in
তে একটি সদস্যপদ পরীক্ষা list
হ'ল ও (এন) সময়ের জটিলতা। এর অর্থ হ'ল অজগরকে আপনার তালিকার একটি লিনিয়ার স্ক্যান করতে হবে, প্রতিটি উপাদানটিতে গিয়ে অনুসন্ধান আইটেমের সাথে তুলনা করতে হবে। আপনি যদি বারবার এটি করছেন, বা তালিকাগুলি বড় হয় তবে এই অপারেশনটিতে একটি ওভারহেড লাগবে।
set
অন্যদিকে অবজেক্টগুলি স্থির সময়ের সদস্যপদ চেক করার জন্য তাদের মানগুলি হ্যাশ করে। চেকটি ব্যবহার করেও করা হয় in
:
1 in {1, 2, 3}
# True
'a' not in {'a', 'b', 'c'}
# False
(1, 2) in {('a', 'c'), (1, 2)}
# True
আপনি যদি দুর্ভাগ্যজনক হন যে আপনি যে উপাদানটি অনুসন্ধান করছেন / অনুসন্ধান করছেন না তা আপনার তালিকার শেষে রয়েছে, অজগরটি তালিকাটি শেষ পর্যন্ত স্ক্যান করবে have এটি নীচের সময়গুলি থেকে স্পষ্ট:
l = list(range(100001))
s = set(l)
%timeit 100000 in l
%timeit 100000 in s
2.58 ms ± 58.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
101 ns ± 9.53 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
অনুস্মারক হিসাবে, আপনি যতক্ষণ উপাদান সংরক্ষণ করছেন এবং সন্ধান করছেন ততক্ষণ এটি উপযুক্ত বিকল্প। আইওডাব্লু, তাদের হয় হয় অপরিবর্তনীয় প্রকারের, বা বস্তু যা বাস্তবায়ন করে __hash__
।
3 -1 > 0 and (4-1 , 5) not in []
⤇True
তাই ত্রুটি অপারেটর নজরে নয়।