Python একটি স্ট্রিং 'রয়েছে' substring পদ্ধতি আছে?




contains (10)

আমি পাইথন একটি string.contains বা string.indexof পদ্ধতি খুঁজছেন।

আমি করতে চাই:

if not somestring.contains("blah"):
   continue

Python একটি স্ট্রিং substring পদ্ধতি রয়েছে?

হ্যাঁ, কিন্তু পাইথনের তুলনামূলক অপারেটর রয়েছে যা আপনাকে পরিবর্তে ব্যবহার করতে হবে, কারণ ভাষাটি তার ব্যবহারের উদ্দেশ্যে থাকে এবং অন্য প্রোগ্রামাররা আপনাকে এটি ব্যবহার করার প্রত্যাশা করবে। যে শব্দটি, যা একটি তুলনা অপারেটর হিসাবে ব্যবহার করা হয়:

>>> '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 ফেরত। আপনি superstring এর দৃষ্টান্ত থেকে এই ফাংশন কল করতে পারে:

'**foo**'.__contains__('foo')

কিন্তু না। Underscores সঙ্গে শুরু যে পদ্ধতি semantically ব্যক্তিগত বলে মনে করা হয়। এটি ব্যবহার করার একমাত্র কারণ কার্যকারিতার in এবং not in বাড়ানো হলে (উদাহরণস্বরূপ, strclassing 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

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

পারফরম্যান্স তুলনা

আমরা একই লক্ষ্য অর্জন করার বিভিন্ন উপায়ে তুলনা করতে পারি।

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'))),
}

এবং এখন আমরা দেখেছি যে অন্যদের মধ্যে তুলনায় অনেক দ্রুত। একটি সমতুল্য অপারেশন করতে কম সময় ভাল:

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

পাইথন স্ট্রিং এবং তালিকা

এখানে কয়েকটি দরকারী উদাহরণ রয়েছে যা পদ্ধতির বিষয়ে নিজেদের জন্য কথা বলে:

"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

সতর্কীকরণ। তালিকাটি iterables হয়, এবং পদ্ধতিতে কেবল স্ট্রিং নয়, iterables উপর কাজ করে।


আপনি "blah" in somestring সঙ্গে খুশি কিন্তু এটি একটি ফাংশন কল হতে চান, আপনি সম্ভবত এই কাজ করতে পারেন

import operator

if not operator.contains(somestring, "blah"):
    continue

পাইথন এ সমস্ত অপারেটর অপারেটর মডিউল সহ কম বা কম পাওয়া যেতে পারে।


আমি ইতিমধ্যে উত্তর আছে দেখতে কিন্তু আমি আমার দুটি সেন্ট যোগ করতে চান।

পাইথনটিতে এটি করার জন্য ফাংশন রয়েছে তবে সবচেয়ে সহজ (এবং সর্বাধিক পছন্দের) পদ্ধতিটি কীওয়ার্ডটি ব্যবহার করা in :

"test" in "testtext"
True

"abc" in "abcdefg"
True

"abc" in "Abc"
False

"ABC" in "abc"
False

"abc" in "def"
False

"abc" in ["abc", "def", "ghi"]
True

পাশাপাশি কিছু স্ট্রিং পদ্ধতি আছে:

"xxabcxx".find("abc")
2 #returns the index of the first match

"xxabcxx".find("cde")
-1 #returns -1 if the substring 
#could not be found in the string

# and:

"xxabcxx".index("abc")
2

"xxabcxx".index("cde")
ValueError: substring not found
#raises ValueError...

কর্মক্ষমতা সম্পর্কে:

সাধারণভাবে একটি substring খুঁজে দ্রুত উপায়ে পদ্ধতি ...

find index তুলনায় সামান্য দ্রুত

আমি সাহায্য করতে পারে আশা করি!


এখানে আপনার উত্তর:

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

এটি কেবল একটি string.find("substring") অনুসন্ধান যদি আপনি 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. প্রিন্ট হবে Found 'is' in the string. একইভাবে, if "is" in s: True মূল্যায়ন করা হবে। এই আপনি চান বা হতে পারে না।


পাইথনটিতে দুটি সহজ উপায় রয়েছে যা আপনি অর্জন করতে পারেন:

পাইথনিক উপায়: পাইথনের 'ইন' কীওয়ার্ড ব্যবহার করে-

দুইটি "আর্গুমেন্টস", বাম ( পদার্থবিন্যাস ) এবং ডানদিকে অন্যটি নিয়ে নেয় এবং বাম আর্গুমেন্টটি অধিকারযুক্ত যুক্তি অনুসারে থাকে এবং যদি না হয় তবে সত্যটি ফেরত দেয়, এটি False

example_string = "This is an example string"
substring = "example"
print(substring in example_string)

আউটপুট:

True

অ-পাইথনিক উপায়: পাইথন এর str.find ব্যবহার করে:

find পদ্ধতি স্ট্রিং-এর স্ট্রিংয়ের অবস্থানে ফিরে আসে না যদি -1 এটি না পাওয়া যায়। কিন্তু অবস্থান -1 না হলে কেবল চেক করুন।

if example_string.find(substring) != -1:
    print('Substring found!')
else:
    print('Substring not found!')

আউটপুট:

Substring found!

মূলত, আপনি পাইথন একটি স্ট্রিং একটি substring খুঁজে পেতে চান। পাইথন একটি স্ট্রিং একটি substring জন্য অনুসন্ধান করার দুটি উপায় আছে।

পদ্ধতি 1: অপারেটর

আপনি একটি substring চেক করার জন্য পাইথন in অপারেটর ব্যবহার করতে পারেন। এটা বেশ সহজ এবং স্বজ্ঞাত। স্ট্রিং অন্য স্ট্রিং অন্যথায় False পাওয়া যায় যদি এটা True ফিরে আসবে।

>>> "King" in "King's landing"
True

>>> "Jon Snow" in "King's landing"
False

পদ্ধতি 2: str.find() পদ্ধতি

দ্বিতীয় পদ্ধতি str.find() পদ্ধতি ব্যবহার করা হয়। এখানে, আমরা স্ট্রিং উপর .find() পদ্ধতি কল যা substring পাওয়া যায়। আমরা find () পদ্ধতিতে সাবস্ট্রিংটি পাস করি এবং তার ফেরত মান পরীক্ষা করে দেখি। যদি এর মান -1 এর থেকে অন্য হয়, তবে পদার্থটি স্ট্রিংয়ে পাওয়া যায়, অন্যথা নয়। ফেরত মান সূচক হয় যেখানে substring পাওয়া যায়।

>>> some_string = "valar morghulis"

>>> some_string.find("morghulis")
6

>>> some_string.find("dohaeris")
-1

আমি আপনাকে আরও পাইথনিক এবং স্বজ্ঞাত হিসাবে প্রথম পদ্ধতি ব্যবহার করার পরামর্শ দিচ্ছি।


সুতরাং দৃশ্যত ভেক্টর-ভিত্তিক তুলনা জন্য অনুরূপ কিছুই নেই। তাই করার জন্য একটি সুস্পষ্ট পাইথন উপায় হবে:

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

if needle in haystack: স্বাভাবিক ব্যবহার হয়, যেমন @ মাইকেল বলেছেন - এটি in অপারেটরের উপর নির্ভর করে, একটি পদ্ধতি কল চেয়ে আরও পাঠযোগ্য এবং দ্রুত।

আপনি যদি কোনও অপারেটরের পরিবর্তে কোনও পদ্ধতির প্রয়োজন হয় (উদাহরণস্বরূপ, কিছু অদ্ভুত key= একটি অসাধারণ ধরণের জন্য ...?), এটি 'haystack'.__contains__ । কিন্তু যেহেতু আপনার উদাহরণটি if একটি ব্যবহারের জন্য হয় if আমি অনুমান করি যে আপনি যা বলছেন তা আসলেই বোঝা যায় না ;-)। বিশেষ পদ্ধতি ব্যবহার করার জন্য এটি ভাল ফর্ম (না পঠনযোগ্য, না দক্ষ) নয় - এটি ব্যবহার করা হয়, পরিবর্তে অপারেটরদের এবং বিল্টিনগুলির মাধ্যমে তাদের ব্যবহার করা হয়।







contains