উত্তর:
আপনি in
অপারেটরটি ব্যবহার করতে পারেন :
if "blah" not in somestring:
continue
TypeError: argument of type 'NoneType' is not iterable
in
অপারেটর কি রবিন-কার্প অ্যালগরিদম ব্যবহার করে?
যদি এটি কেবল একটি সাবস্ট্রিং অনুসন্ধান হয় তবে আপনি ব্যবহার করতে পারেন string.find("substring")
।
আপনার সাথে একটি সামান্য সতর্কতা অবলম্বন করা আবশ্যক আছে find
, index
এবং in
, যদিও তারা অনুসন্ধানসমূহ সাবস্ট্রিং করছে। অন্য কথায়, এটি:
s = "This be a string"
if s.find("is") == -1:
print("No 'is' here!")
else:
print("Found 'is' in the string.")
এটি Found 'is' in the string.
একইভাবে মুদ্রণ if "is" in s:
করবে, মূল্যায়ন করবে True
। এটি আপনি যা চান তা হতে পারে বা নাও পারে।
if ' is ' in s:
যা False
প্রত্যাশিত হিসাবে ফিরে আসবে।
\bis\b
( কেস সীমানা) সন্ধানের ক্ষেত্রে সংবেদনশীল রেজেক্স অনুসন্ধান করা ভাল ।
' is '
, বিশেষত, এটা ধরা হবে না This is, a comma'
বা 'It is.'
।
s.split(string.punctuation + string.whitespace)
গেলে তা একবারেও বিভক্ত হবে; ফাংশনগুলির / / পরিবারের split
মতো নয় , এটি কেবল তখন বিভক্ত হয় যখন এটি সমস্ত ক্রমান্বয়ে অক্ষরকে যথাযথভাবে দেখতে পায়। আপনি যদি চরিত্রের ক্লাসগুলিতে বিভক্ত করতে চান তবে আপনি নিয়মিত অভিব্যক্তিগুলিতে ফিরে এসেছেন (যে বিন্দুতে বিচ্ছেদ ছাড়াই অনুসন্ধান করা সহজ এবং দ্রুতগতিতে চলে যাওয়া)। strip
rstrip
lstrip
r'\bis\b'
'is' not in (w.lower() for w in s.translate(string.maketrans(' ' * len(string.punctuation + string.whitespace), string.punctuation + string.whitespace)).split()
- ঠিক আছে, পয়েন্ট নেওয়া হয়েছে। এটি এখন হাস্যকর ...
পাইথনের স্ট্রিংটিতে কি স্ট্রিং পদ্ধতি রয়েছে?
হ্যাঁ, তবে পাইথনের একটি তুলনামূলক অপারেটর রয়েছে যা আপনার পরিবর্তে ব্যবহার করা উচিত, কারণ ভাষাটি এর ব্যবহারের পরিকল্পনা করে এবং অন্যান্য প্রোগ্রামাররা আপনাকে এটি ব্যবহার করার প্রত্যাশা করবে। সেই কীওয়ার্ডটি in
, যা তুলনা অপারেটর হিসাবে ব্যবহৃত হয়:
>>> 'foo' in '**foo**'
True
বিপরীত (পরিপূরক), যা মূল প্রশ্নটি জিজ্ঞাসা করে তা হ'ল not in
:
>>> 'foo' not in '**foo**' # returns False
False
এটি শব্দার্থগতভাবে একই not 'foo' in '**foo**'
তবে এটি অনেক বেশি পঠনযোগ্য এবং স্পষ্টভাবে ভাষায় পাঠযোগ্যতার উন্নতি হিসাবে সরবরাহ করা হয়েছে।
__contains__
, find
এবংindex
প্রতিশ্রুতি হিসাবে, এখানে contains
পদ্ধতি:
str.__contains__('**foo**', 'foo')
আয় True
। আপনি এই ফাংশনটিকে সুপারস্টারনের উদাহরণ থেকে কল করতে পারেন:
'**foo**'.__contains__('foo')
কিন্তু না। আন্ডারস্কোর দিয়ে শুরু হওয়া পদ্ধতিগুলি শব্দার্থগতভাবে ব্যক্তিগত হিসাবে বিবেচিত হয়। এটি ব্যবহারের একমাত্র কারণ হ'ল in
এবং not in
কার্যকারিতা প্রসারিত করা (উদাহরণস্বরূপ যদি সাবক্লাসিং হয় str
):
class NoisyString(str):
def __contains__(self, other):
print('testing if "{0}" in "{1}"'.format(other, self))
return super(NoisyString, self).__contains__(other)
ns = NoisyString('a string with a substring inside')
এবং এখন:
>>> 'substring' in ns
testing if "substring" in "a string with a substring inside"
True
এছাড়াও, নিম্নলিখিত স্ট্রিং পদ্ধতিগুলি এড়িয়ে চলুন:
>>> '**foo**'.index('foo')
2
>>> '**foo**'.find('foo')
2
>>> '**oo**'.find('foo')
-1
>>> '**oo**'.index('foo')
Traceback (most recent call last):
File "<pyshell#40>", line 1, in <module>
'**oo**'.index('foo')
ValueError: substring not found
অন্য ভাষাগুলিতে সরাসরি সাবস্ট্রিংগুলির জন্য সরাসরি পরীক্ষা করার কোনও পদ্ধতি নেই এবং তাই আপনাকে এই ধরণের পদ্ধতি ব্যবহার করতে হবে তবে পাইথনের সাথে in
তুলনা অপারেটরটি ব্যবহার করা আরও কার্যকর is
আমরা একই লক্ষ্য অর্জনের বিভিন্ন উপায়ের তুলনা করতে পারি।
import timeit
def in_(s, other):
return other in s
def contains(s, other):
return s.__contains__(other)
def find(s, other):
return s.find(other) != -1
def index(s, other):
try:
s.index(other)
except ValueError:
return False
else:
return True
perf_dict = {
'in:True': min(timeit.repeat(lambda: in_('superstring', 'str'))),
'in:False': min(timeit.repeat(lambda: in_('superstring', 'not'))),
'__contains__:True': min(timeit.repeat(lambda: contains('superstring', 'str'))),
'__contains__:False': min(timeit.repeat(lambda: contains('superstring', 'not'))),
'find:True': min(timeit.repeat(lambda: find('superstring', 'str'))),
'find:False': min(timeit.repeat(lambda: find('superstring', 'not'))),
'index:True': min(timeit.repeat(lambda: index('superstring', 'str'))),
'index:False': min(timeit.repeat(lambda: index('superstring', 'not'))),
}
এবং এখন আমরা দেখতে পাচ্ছি যে in
ব্যবহারগুলি অন্যদের তুলনায় অনেক দ্রুত। সমমানের অপারেশন করার জন্য কম সময় দেওয়া ভাল:
>>> perf_dict
{'in:True': 0.16450627865128808,
'in:False': 0.1609668098178645,
'__contains__:True': 0.24355481654697542,
'__contains__:False': 0.24382793854783813,
'find:True': 0.3067379407923454,
'find:False': 0.29860888058124146,
'index:True': 0.29647137792585454,
'index:False': 0.5502287584545229}
str.index
এবং str.find
? আপনি অন্য কাউকে কীভাবে কোনও স্ট্রিংয়ের সূচকটি সন্ধান করার পরিবর্তে এটির উপস্থিতি নেই বা না থাকার পরামর্শ দেবেন? (বা এর অর্থ s.find(ss) != -1
ss in s
re
মডিউলটির মার্জিত ব্যবহারের মাধ্যমে আরও ভালভাবে চিহ্নিত করা যেতে পারে । আমি এখনও লিখেছি এমন কোনও কোডে নিজেকে str.index বা str.find এর ব্যবহার খুঁজে পাইনি।
str.count
পাশাপাশি আপনার ব্যবহারের বিরুদ্ধে পরামর্শের উত্তরটি প্রসারিত করুন string.count(something) != 0
। ভয়ে কাঁপে
operator
মডিউল সংস্করণটি কীভাবে সম্পাদন করে?
in_
উপরের মতোই - তবে এটির চারপাশে স্ট্যাকফ্রেম রয়েছে, তাই এটি তার চেয়ে ধীর গতিতে: github.com/python/cpython/blob/3.7/Lib/operator.py#L153
if needle in haystack:
সাধারণ ব্যবহার যেমন @ মিশেল বলেছেন - এটি in
অপারেটরের উপর নির্ভর করে , একটি পদ্ধতির কলের চেয়ে আরও পঠনযোগ্য এবং দ্রুত।
আপনার যদি সত্যই অপারেটরের পরিবর্তে কোনও পদ্ধতির প্রয়োজন হয় (উদাহরণস্বরূপ key=
খুব অদ্ভুত সাজানোর জন্য কিছু অদ্ভুত কিছু করা ...?), এটি হবে 'haystack'.__contains__
। তবে যেহেতু আপনার উদাহরণটি ব্যবহারের জন্য if
, তাই আমি অনুমান করি যে আপনি যা বলছেন তা সত্যই আপনি বোঝাতে চাইছেন না ;-)। সরাসরি বিশেষ পদ্ধতি ব্যবহার করা ভাল ফর্ম (না পাঠযোগ্য, না দক্ষ) নয় - সেগুলি অপারেটর এবং বিল্টিনগুলির মাধ্যমে তাদেরকে অর্পণ করা হয় used
in
পাইথনের স্ট্রিং এবং তালিকাin
পদ্ধতি সম্পর্কে নিজেদের জন্য কথা বলার জন্য এখানে কয়েকটি দরকারী উদাহরণ দেওয়া হল :
"foo" in "foobar"
True
"foo" in "Foobar"
False
"foo" in "Foobar".lower()
True
"foo".capitalize() in "Foobar"
True
"foo" in ["bar", "foo", "foobar"]
True
"foo" in ["fo", "o", "foobar"]
False
["foo" in a for a in ["fo", "o", "foobar"]]
[False, False, True]
সতর্কীকরণ। তালিকাগুলি পুনরাবৃত্ত হয় এবং in
পদ্ধতিটি কেবল স্ট্রিংগুলিতে নয়, পুনরাবৃত্তকারীগুলিতে কাজ করে।
["bar", "foo", "foobar"] in "foof"
?
আপনি যদি খুশি হন "blah" in somestring
তবে এটি কোনও ফাংশন / পদ্ধতি কল হতে চান, আপনি সম্ভবত এটি করতে পারেন
import operator
if not operator.contains(somestring, "blah"):
continue
পাইথনের সমস্ত অপারেটর কম-বেশি অপারেটর মডিউল সহ পাওয়া যেতে পারে in
।
সুতরাং স্পষ্টতই ভেক্টর-ভিত্তিক তুলনার জন্য তেমন কিছু নেই for এটি করার একটি সুস্পষ্ট পাইথন উপায় হ'ল:
names = ['bob', 'john', 'mike']
any(st in 'bob and john' for st in names)
>> True
any(st in 'mary and jane' for st in names)
>> False
in
তালিকার সাথে ব্যবহার করা উচিত নয় এমন কিছুই নয় কারণ এটি উপাদানগুলির একটি রৈখিক স্ক্যান করে এবং তুলনায় ধীর হয়। পরিবর্তে একটি সেট ব্যবহার করুন, বিশেষত যদি সদস্যপদ পরীক্ষা বারবার করা হয়।
আপনি ব্যবহার করতে পারেন y.count()
।
এটি কোনও স্ট্রিংয়ের মধ্যে একটি উপ স্ট্রিং প্রদর্শিত হওয়ার সংখ্যার পূর্ণসংখ্যার মানটি প্রদান করবে।
উদাহরণ স্বরূপ:
string.count("bah") >> 0
string.count("Hello") >> 1
আপনার উত্তর এখানে:
if "insert_char_or_string_here" in "insert_string_to_search_here":
#DOSTUFF
এটি মিথ্যা কিনা তা যাচাইয়ের জন্য:
if not "insert_char_or_string_here" in "insert_string_to_search_here":
#DOSTUFF
বা:
if "insert_char_or_string_here" not in "insert_string_to_search_here":
#DOSTUFF
__contains__(self, item)
,__iter__(self)
আর__getitem__(self, key)
যাতে নির্ধারণ একটি প্রদত্ত এ একটি আইটেম মিথ্যা রয়েছে কিনা হবে।in
আপনার কাস্টম প্রকারের জন্য উপলভ্য করতে কমপক্ষে সেগুলির একটির প্রয়োগ করুন ।