একটি স্ট্রিংয়ে প্রদত্ত সাবস্ট্রিংয়ের সংখ্যার সংখ্যা গণনা করুন


201

পাইথনের একটি স্ট্রিংয়ের মধ্যে প্রদত্ত সাবস্ট্রিং উপস্থিত থাকার সংখ্যাটি আমি কীভাবে গণনা করতে পারি?

উদাহরণ স্বরূপ:

>>> 'foo bar foo'.numberOfOccurrences('foo')
2

"সংখ্যার সাবস্ট্রিং" বলতে কী বোঝ? সাবস্ট্রিংয়ের অবস্থান? সাবস্ট্রিং কতবার ঘটে? অন্যকিছু?
গ্রিনম্যাট

2
এটি কি হোমওয়ার্কের কাজ? যদি তা হয় তবে দয়া করে আপনার প্রশ্নের সাথে "হোমওয়ার্ক" ট্যাগ যুক্ত করুন। এছাড়াও, আপনার প্রশ্ন খুব পরিষ্কার নয়। আপনি যা জিজ্ঞাসা করছেন বলে মনে হচ্ছে আমি তার উত্তর দেব, তবে আমার সন্দেহ হয় যে আপনি সত্যিই অন্য কিছু খুঁজে পেতে চান।
জিম DeLaHunt

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

@ জিমডিএলহান্ট রেকর্ডগুলির জন্য, cscircles.cemc.uwaterloo.ca/8-remix- এ এই সম্পর্কে একটি মহড়া রয়েছে - কোডিং অনুশীলন দেখুন: সাবস্ট্রিং কাউন্টিং
নিকোস আলেকজান্দ্রিস

উত্তর:


334

string.count(substring)এর মতো:

>>> "abcdabcva".count("ab")
2

হালনাগাদ:

মন্তব্যে ইঙ্গিত হিসাবে, ওভারল্যাপিং-এর অঘটনগুলির জন্য এটি করার উপায় । যদি আপনাকে ওভারল্যাপিংয়ের ঘটনাগুলি গণনা করতে হয়, তবে আপনি উত্তরগুলি আরও ভাল করে পরীক্ষা করতে পারেন: " পাইথন রেজেক্স সমস্ত ওভারল্যাপিং মিল খুঁজে পাবে? ", বা নীচে আমার অন্য উত্তরটি পরীক্ষা করে দেখুন।


14
এটি সম্পর্কে কী: "GCAAAAAG".count("AAA")যা 1 দেয়, যখন সঠিক উত্তরটি 3?
কার্টুনিস্ট

12
countস্পষ্টতই অ-ওভারল্যাপিং ম্যাচের জন্য - যা প্রায়শই কেউ করতে চায়। stackoverflow.com/questions/5616822/... ম্যাচ ওভারল্যাপিং সাথে চুক্তি - কিন্তু একটি সহজ, ব্যয়বহুল, তাহলে অভিব্যক্তি:sum("GCAAAAAGH"[i:].startswith("AAA") for i in range(len("GCAAAAAGH")))
jsbueno

একসাথে একাধিক শব্দ গণনা / অনুসন্ধান করা সম্ভব? স্ট্রিং.কাউন্টের মতো (সাবস্ট্রিং 1, সাবস্ট্রিং 2)
সুশান্ত কুলকারনী

@SushantKulkarni নং যদিও এই ধরনের একটি জিনিস করছেন এক যৌক্তিক উপায় আছে: string.count(substring1) + string.count(substring2)। তবে মনে রাখবেন যে সাবস্ট্রিংগুলি প্রচুর পরিমাণে থাকলে এটি একটি কার্যকর পদ্ধতি নয় কারণ প্রতিটি স্ট্রিংয়ের গণনা করার জন্য মূল স্ট্রিংয়ের উপরে একটি পুনরাবৃত্তি প্রয়োজন।
ফাহেল

@ সুশান্তকুলকার্নি করা ''.join([substring1, substring2]).count(pattern)উপরে উল্লিখিত সমাধানের চেয়ে কার্যকর is আমি টাইমিট ব্যবহার করে পরীক্ষা করেছি।
এনরিক ক্যালাবাইগ


19

আপনার সত্যিকারের অর্থটি নির্ভর করে আমি নিম্নলিখিত সমাধানগুলি প্রস্তাব করছি:

  1. আপনার অর্থ স্থান পৃথক সাব-স্ট্রিংগুলির একটি তালিকা এবং আপনি জানতে চান যে সমস্ত সাব-স্ট্রিংয়ের মধ্যে সাব-স্ট্রিং অবস্থানের সংখ্যাটি কী:

    s = 'sub1 sub2 sub3'
    s.split().index('sub2')
    >>> 1
  2. আপনি স্ট্রিংয়ের উপ-স্ট্রিংয়ের চর-অবস্থান বলতে চাইছেন:

    s.find('sub2')
    >>> 5
  3. আপনি (অ ওভারল্যাপিং) মানে গন্য সু bstring চেহারা:

    s.count('sub2')
    >>> 1
    s.count('sub')
    >>> 3

'সাব' বা 'সু' সন্ধান করার চেষ্টা করুন
ওবহোভিক

আমি আপনাকে বোঝাতে চাইছি s.find("su")এবং ভাবছি কেন আপনি পেয়েছেন 0? আচ্ছা এই উপ-স্ট্রিং এর প্রথম সূচক "su"মধ্যে s। ব্যবহার করে দেখুন "ub"এবং আপনি হবে পেতে 1, যেমন চেষ্টা "z"এবং আপনি পাবেন -1কোন সাবস্ট্রিং হিসেবে পাওয়া যায় নি।
ডন প্রশ্ন

আমি বলতে চাইছি আপনি সর্বদা প্রথম সূচকটি খুঁজে পান তবে সমস্ত সূচী নয়, @ অরুন-কুমার-খাত্ত্রি সঠিক উত্তর দিয়েছেন
obohovyk

আমি স্বস্তি পেয়েছি যে @ অরুন-কুমার-খাত্ত্রি আপনি যে "সঠিক" উত্তরটি খুঁজছিলেন তা দিয়েছিল। সম্ভবত আপনার জাসবুয়েনোর মন্তব্যগুলিতে অতিরিক্ত নজর দেওয়া উচিত, কখনও কখনও তারা এখনও সন্ধান করেন নি এমন প্রশ্নের উত্তর দেয়।
ডন প্রশ্ন

তৃতীয় পদ্ধতির জন্য পছন্দ করুন। বিটিডাব্লু, আমি মনে করি আপনার উল্লেখ করা উচিত যে এটি নন-ওভারল্যাপিংয়ের ক্ষেত্রে কাজ করে।
জিনব আব্বাসিমাজার

12

প্রদত্ত স্ট্রিংয়ে ওভারল্যাপিং সাব-স্ট্রিংয়ের সন্ধানের সর্বোত্তম উপায় হল পাইথন নিয়মিত এক্সপ্রেশন ব্যবহার করা এটি নিয়মিত এক্সপ্রেশন লাইব্রেরি ব্যবহার করে সমস্ত ওভারল্যাপিং মিল খুঁজে পাবে। এখানে এটি কীভাবে বাম করবেন তা হল সাবস্ট্রিং এবং ডানদিকে আপনি ম্যাচের জন্য স্ট্রিং সরবরাহ করবেন

print len(re.findall('(?=aa)','caaaab'))
3

2
সম্ভবত আপনি সাব স্ট্রিংটি গতিশীলভাবে সন্নিবেশ করতে লেন (পুনরায় ফিন্ডাল (চ '(? = {সাব_ স্ট্রিং})', 'কায়াব') যোগ করতে পারেন :)
আম্রেশ গিরি

10

পাইথন 3 এ স্ট্রিংয়ের একটি স্ট্রিংয়ের ওভারল্যাপিং ইভেন্টগুলি অনুসন্ধান করতে, এই অ্যালগরিদমটি করবে:

def count_substring(string,sub_string):
    l=len(sub_string)
    count=0
    for i in range(len(string)-len(sub_string)+1):
        if(string[i:i+len(sub_string)] == sub_string ):      
            count+=1
    return count  

আমি নিজেই এই অ্যালগরিদম পরীক্ষা করেছি এবং এটি কার্যকর হয়েছে।


1
ছোট্ট টিপ: "এটি কাজ করে কারণ এটি পরীক্ষা করেছিলাম" বলার পরিবর্তে আপনি কোনও অনলাইন সার্ভিসে যেমন একটি নমুনা ডেটা সহ repl.it এর উদাহরণ অন্তর্ভুক্ত করতে পারেন ।
ভ্যালেন্টিন

1
আপনার মন্তব্যের জন্য ধন্যবাদ ভ্যালেন্টিন! এটা এখানে আমার প্রথম উত্তর। আমি আমার পরবর্তী উত্তরগুলি থেকে নিজেকে উন্নত করব।
ভরথ কুমার আর

10

আপনি দুটি উপায় ব্যবহার করে ফ্রিকোয়েন্সি গণনা করতে পারেন:

  1. ব্যবহার count()মধ্যে str:

    a.count(b)

  2. বা, আপনি ব্যবহার করতে পারেন:

    len(a.split(b))-1

aস্ট্রিংটি কোথায় রয়েছে এবং bস্ট্রস্ট্রিং যার ফ্রিকোয়েন্সি গণনা করতে হবে।


7

পদ্ধতির সাথে জড়িত বর্তমানের সেরা উত্তরটি countপ্রকৃতপক্ষে ওভারল্যাপিংয়ের জন্য গণনা করে না এবং খালি সাব-স্ট্রিংগুলিরও যত্ন করে না। উদাহরণ স্বরূপ:

>>> a = 'caatatab'
>>> b = 'ata'
>>> print(a.count(b)) #overlapping
1
>>>print(a.count('')) #empty string
9

প্রথম উত্তরটি হওয়া উচিত 2নয় 1, যদি আমরা ওভারল্যাপিং সাবস্ট্রিংগুলি বিবেচনা করি। দ্বিতীয় উত্তরের হিসাবে এটি খালি সাব-স্ট্রিংটি asnwer হিসাবে 0 ফেরত দিলে ভাল।

নিম্নলিখিত কোড এই জিনিসগুলির যত্ন করে।

def num_of_patterns(astr,pattern):
    astr, pattern = astr.strip(), pattern.strip()
    if pattern == '': return 0

    ind, count, start_flag = 0,0,0
    while True:
        try:
            if start_flag == 0:
                ind = astr.index(pattern)
                start_flag = 1
            else:
                ind += 1 + astr[ind+1:].index(pattern)
            count += 1
        except:
            break
    return count

এখন যখন আমরা এটি চালাব:

>>>num_of_patterns('caatatab', 'ata') #overlapping
2
>>>num_of_patterns('caatatab', '') #empty string
0
>>>num_of_patterns('abcdabcva','ab') #normal
2

6

দৃশ্য 1: একটি বাক্যে একটি শব্দের সংঘটন। উদাহরণ: str1 = "This is an example and is easy"। শব্দটির সংঘটন "হ'ল"। করতে দেয়str2 = "is"

count = str1.count(str2)

দৃশ্য 2: একটি বাক্যে প্যাটার্নের ঘটনা।

string = "ABCDCDC"
substring = "CDC"

def count_substring(string,sub_string):
    len1 = len(string)
    len2 = len(sub_string)
    j =0
    counter = 0
    while(j < len1):
        if(string[j] == sub_string[0]):
            if(string[j:j+len2] == sub_string):
                counter += 1
        j += 1

    return counter

ধন্যবাদ!


(স্ট্রিং [j] == সাব_স্ট্রিং [0]): আমাদের কি সত্যিই এই চেকটি দরকার? শর্তের পরে কি এটি স্বয়ংক্রিয়ভাবে আবৃত হয় না?
আনন্দভিসনাথন 89

আনন্দভিসনাথন ৯৯, উভয় শর্তের শর্ত প্রয়োজন হলে, যদি (স্ট্রিং [জে] == সাব_স্ট্রিং [0]) মূল স্ট্রিংয়ের মধ্যে প্রাথমিক চরিত্রের ম্যাচটি পরীক্ষা করে, যা মূল স্ট্রিংয়ের পুরো অক্ষরের জন্য সম্পাদন করতে হয় এবং (স্ট্রিং [ j: j + len2] == সাব_ স্ট্রিং) পদার্থের উপস্থিতি সম্পাদন করে। যদি এটি প্রথম সংঘটিত হয় তবে দ্বিতীয়টি যদি শর্তটি যথেষ্ট হয়।
অমিথ ভিভি

4

প্রশ্নটি খুব স্পষ্ট নয়, তবে আমি কী জবাব দিচ্ছি, ভূপৃষ্ঠে, জিজ্ঞাসা করছি।

একটি স্ট্রিং এস, যা এল অক্ষর দীর্ঘ, এবং যেখানে এস [1] স্ট্রিংয়ের প্রথম অক্ষর এবং এস [এল] সর্বশেষ অক্ষর, নিম্নলিখিত সাবস্ট্রিংগুলি রয়েছে:

  • নাল স্ট্রিং ''। এর মধ্যে একটি রয়েছে।
  • 1 থেকে L পর্যন্ত প্রতিটি মানের জন্য, A থেকে L পর্যন্ত প্রতিটি মানের জন্য, স্ট্রিং এস [এ] .. এস [বি] (অন্তর্ভুক্ত)। মোট 0.5% * এল * (এল + 1) এর জন্য এই স্ট্রিংগুলির মধ্যে L + L-1 + L-2 + ... 1 রয়েছে।
  • নোট করুন যে দ্বিতীয় আইটেমটিতে এস [1] .. এস [এল], অর্থাৎ পুরো আসল স্ট্রিং এস অন্তর্ভুক্ত রয়েছে Note

সুতরাং, দৈর্ঘ্যের একটি স্ট্রিংয়ের মধ্যে 0.5 * এল * (এল + 1) + 1 সাবস্ট্রিং রয়েছে এল। পাইথনের যে অভিব্যক্তিটি রেন্ডার করে এবং আপনার স্ট্রিংয়ের মধ্যে উপস্থিত সাবস্ট্রিংগুলির সংখ্যা রয়েছে।


4

একটি উপায় ব্যবহার করা হয় re.subn। উদাহরণস্বরূপ, যে 'hello'কোনও ক্ষেত্রে আপনি করতে পারেন এর সংঘটনগুলির সংখ্যা গণনা করতে:

import re
_, count = re.subn(r'hello', '', astring, flags=re.I)
print('Found', count, 'occurrences of "hello"')

আমার জন্য শব্দ, ধন্যবাদ। @ সন্তোষ, উত্তর মেনে নিচ্ছেন না কেন?
মাওগ বলছে মনিকা

2

আমি আমার গৃহীত উত্তরটিকে "এটি করার সহজ এবং সুস্পষ্ট উপায়" হিসাবে রাখব - তবে এতে ওভারল্যাপিংয়ের ঘটনাগুলি আচ্ছাদন করে না। সেগুলি নির্বিঘ্নে টুকরোগুলির একাধিক চেকিংয়ের সাথে করা যায় - যেমনটি: যোগফল ("জিসিএএএএএএজিএইচ" [i:]

(যা ফলন দেয় 3) - এটি নিয়মিত প্রকাশের কৌশল দ্বারা ব্যবহার করা যেতে পারে, যেমন পাইথন রেজেেক্সে দেখা যাবে সমস্ত ওভারল্যাপিং ম্যাচগুলি খুঁজে পাওয়া যায় ? - এবং এটি সূক্ষ্ম কোড গল্ফিংয়ের জন্যও তৈরি করতে পারে - এটি এমন একটি স্ট্রিংয়ের নিদর্শনগুলির ওভারল্যাপিংয়ের জন্য আমার "হ্যান্ড মেড" গণনা যা অত্যন্ত নিখুঁত হওয়ার চেষ্টা করে না (অন্তত প্রতিটি ইন্টারঅ্যাকশনে এটি নতুন স্ট্রিং অবজেক্ট তৈরি করে না):

def find_matches_overlapping(text, pattern):
    lpat = len(pattern) - 1
    matches = []
    text = array("u", text)
    pattern = array("u", pattern)
    indexes = {}
    for i in range(len(text) - lpat):
        if text[i] == pattern[0]:
            indexes[i] = -1
        for index, counter in list(indexes.items()):
            counter += 1
            if text[i] == pattern[counter]:
                if counter == lpat:
                    matches.append(index)
                    del indexes[index]
                else:
                    indexes[index] = counter
            else:
                del indexes[index]
    return matches

def count_matches(text, pattern):
    return len(find_matches_overlapping(text, pattern))

2

ওভারল্যাপিং ঘটনা:

def olpcount(string,pattern,case_sensitive=True):
    if case_sensitive != True:
        string  = string.lower()
        pattern = pattern.lower()
    l = len(pattern)
    ct = 0
    for c in range(0,len(string)):
        if string[c:c+l] == pattern:
            ct += 1
    return ct

test = 'my maaather lies over the oceaaan'
print test
print olpcount(test,'a')
print olpcount(test,'aa')
print olpcount(test,'aaa')

ফলাফল:

my maaather lies over the oceaaan
6
4
2

2

ওভারল্যাপিং কাউন্টের জন্য আমরা ব্যবহার করতে পারি:

def count_substring(string, sub_string):
    count=0
    beg=0
    while(string.find(sub_string,beg)!=-1) :
        count=count+1
        beg=string.find(sub_string,beg)
        beg=beg+1
    return count

ওভারল্যাপিংয়ের ক্ষেত্রে আমরা গণনা () ফাংশনটি ব্যবহার করতে পারি:

string.count(sub_string)

2

কীভাবে একটি তালিকা বোঝার সাথে এক-লাইনার? প্রযুক্তিগতভাবে এর 93 টি অক্ষর দীর্ঘ, আমাকে পিইপি -8 শুদ্ধি ছাড়াই। যদি একটি উচ্চ স্তরের কোডের টুকরা থাকে তবে regex.findall উত্তরটি সর্বাধিক পঠনযোগ্য। যদি আপনি নিম্ন স্তরের কিছু তৈরি করে থাকেন এবং নির্ভরতা না চান তবে এটি একদম পাতলা এবং গড়পড়তা। আমি ওভারল্যাপিং উত্তর দিচ্ছি। অবশ্যই ওভারল্যাপ না থাকলে কেবল সর্বোচ্চ স্কোর উত্তরের মতো গণনাটি ব্যবহার করুন।

def count_substring(string, sub_string):
    return len([i for i in range(len(string)) if string[i:i+len(sub_string)] == sub_string])

2

আপনি যদি সমস্ত উপ-স্ট্রিং (ওভারল্যাপযুক্ত সহ) গণনা করতে চান তবে এই পদ্ধতিটি ব্যবহার করুন।

import re
def count_substring(string, sub_string):
    regex = '(?='+sub_string+')'
    # print(regex)
    return len(re.findall(regex,string))

1

আপনি যদি কোনও স্ট্রিংয়ের ভিতরে সাবস্ট্রিংয়ের গণনা জানতে চান; নীচে কোড ব্যবহার করুন। কোডটি বোঝা সহজ তাই আমি মন্তব্যগুলি এড়িয়ে গেছি। :)

string=raw_input()
sub_string=raw_input()
start=0
answer=0
length=len(string)
index=string.find(sub_string,start,length)
while index<>-1:
    start=index+1
    answer=answer+1
    index=string.find(sub_string,start,length)
print answer

0

আমি নিশ্চিত না যে এটি ইতিমধ্যে কিছু লক্ষ্য করা হয়েছে কিনা তবে আমি এটি 'ডিসপোজেবল' শব্দের সমাধান হিসাবে ভেবেছিলাম:

for i in xrange(len(word)):
if word[:len(term)] == term:
    count += 1
word = word[1:]

print count

শব্দটি যেখানে আপনি সন্ধান করছেন এবং শব্দটি সেই শব্দটি যা আপনি সন্ধান করছেন


0
string="abc"
mainstr="ncnabckjdjkabcxcxccccxcxcabc"
count=0
for i in range(0,len(mainstr)):
    k=0
    while(k<len(string)):
        if(string[k]==mainstr[i+k]):
            k+=1
        else:
            break   
    if(k==len(string)):
        count+=1;   
print(count)

2
সম্ভবত আপনি এই সমাধানটি কীভাবে অন্যটির থেকে পৃথক তা বিশদভাবে বলতে পারেন, কোনও বিশেষ ক্ষেত্রে কী এটি সমাধান করতে সক্ষম?
এমপাসকোভ

2
যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে এবং / বা কেন এটি সমস্যার সমাধান করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করলে উত্তরের দীর্ঘমেয়াদী মান উন্নত হবে।
ডোনাল্ড হাঁস

0
import re
d = [m.start() for m in re.finditer(seaching, string)] 
print (d)

এটি স্ট্রিংয়ে প্রদর্শিত সাব স্ট্রিংয়ের সংখ্যা এবং সূচকগুলি প্রদর্শন করে।


আমদানি পুনরায় D = [m.start () re.finditer মধ্যে মিটার (ST3, st2) জন্য] বার সাব স্ট্রিং এর সংখ্যা #finding স্ট্রিং এবং প্রদর্শন সূচক মুদ্রণ পাওয়া (ঘ)
ভাস্কর Reddi কে

0
my_string = """Strings are amongst the most popular data types in Python. 
               We can create the strings by enclosing characters in quotes.
               Python treats single quotes the same as double quotes."""

Count = my_string.lower().strip("\n").split(" ").count("string")
Count = my_string.lower().strip("\n").split(" ").count("strings")
print("The number of occurance of word String is : " , Count)
print("The number of occurance of word Strings is : " , Count)

0

ডাউনটাতে ঝুঁকিপূর্ণ কারণ 2+ জন ইতিমধ্যে এই সমাধান সরবরাহ করেছে। এমনকি আমি তাদের একটি upvated। তবে আমার সম্ভবত newbies বুঝতে সহজ।

def count_substring(string, sub_string):
    slen  = len(string)
    sslen = len(sub_string)
    range_s = slen - sslen + 1
    count = 0
    for i in range(range_s):
        if (string[i:i+sslen] == sub_string):
            count += 1
    return count

0

স্থান সীমিতকরণ সহ একটি সাধারণ স্ট্রিংয়ের জন্য ডিক্ট ব্যবহার করা খুব দ্রুত হবে, দয়া করে নীচের মত কোডটি দেখুন

def getStringCount(mnstr:str, sbstr:str='')->int:
    """ Assumes two inputs string giving the string and 
        substring to look for number of occurances 
        Returns the number of occurances of a given string
    """
    x = dict()
    x[sbstr] = 0
    sbstr = sbstr.strip()
    for st in mnstr.split(' '):
        if st not in [sbstr]:
            continue
        try:
            x[st]+=1
        except KeyError:
            x[st] = 1
    return x[sbstr]

s = 'foo bar foo test one two three foo bar'
getStringCount(s,'foo')


0

লজিকের নীচে সমস্ত স্ট্রিং এবং বিশেষ অক্ষরের জন্য কাজ করবে

def cnt_substr(inp_str, sub_str):
    inp_join_str = ''.join(inp_str.split())
    sub_join_str = ''.join(sub_str.split())

    return inp_join_str.count(sub_join_str)

print(cnt_substr("the sky is   $blue and not greenthe sky is   $blue and not green", "the sky"))

0

পাইথন 3 এ সমাধানটি সংবেদনশীল এবং কেস:

s = 'foo bar foo'.upper()
sb = 'foo'.upper()
results = 0
sub_len = len(sb)
for i in range(len(s)):
    if s[i:i+sub_len] == sb:
        results += 1
print(results)

0
j = 0
    while i < len(string):
        sub_string_out = string[i:len(sub_string)+j]
        if sub_string == sub_string_out:
            count += 1
        i += 1
        j += 1
    return count

2
সমস্ত উত্তর প্রশংসা করা হয়েছে, কোড উত্তর শুধুমাত্র বিষয় খুব ভাল ব্যাখ্যা না ঝোঁক। দয়া করে কিছু প্রসঙ্গ যুক্ত করুন।
ক্রাইডি

0
#counting occurence of a substring in another string (overlapping/non overlapping)
s = input('enter the main string: ')# e.g. 'bobazcbobobegbobobgbobobhaklpbobawanbobobobob'
p=input('enter the substring: ')# e.g. 'bob'

counter=0
c=0

for i in range(len(s)-len(p)+1):
    for j in range(len(p)):
        if s[i+j]==p[j]:
            if c<len(p):
                c=c+1
                if c==len(p):
                    counter+=1
                    c=0
                    break
                continue
        else:
            break
print('number of occurences of the substring in the main string is: ',counter)


0

এটি স্ট্রিংয়ের সমস্ত সংঘটন (ওভারল্যাপিং) এর একটি তালিকা তৈরি করে এবং সেগুলি গণনা করে

def num_occ(str1, str2):
    l1, l2 = len(str1), len(str2)
    return len([str1[i:i + l2] for i in range(l1 - l2 + 1) if str1[i:i + l2] == str2])

উদাহরণ:

str1 ='abcabcd'
str2 = 'bc'

এই তালিকাটি তৈরি করবে তবে কেবলমাত্র বোল্ড মানগুলি সংরক্ষণ করবে :

[আব, বিসি , সিএ, আব, বিসি , সিডি]

যে ফিরে আসবে:

len([bc, bc])

1
কমপক্ষে কিছু ব্যাখ্যা যুক্ত করে বিবেচনা করুন যদিও এই প্রশ্নের উত্তর কেন
εηοιτ.εηοιτ

0

এখানে এমন একটি সমাধান রয়েছে যা অ-ওভারল্যাপিং এবং ওভারল্যাপিং উভয় ক্ষেত্রেই কাজ করে। স্পষ্ট করার জন্য: একটি ওভারল্যাপিং সাবস্ট্রিং হ'ল এমন একটি যাঁর শেষ চরিত্রটি তার প্রথম চরিত্রের সাথে সমান।

def substr_count(st, sub):
    # If a non-overlapping substring then just
    # use the standard string `count` method
    # to count the substring occurences
    if sub[0] != sub[-1]:
        return st.count(sub)

    # Otherwise, create a copy of the source string,
    # and starting from the index of the first occurence
    # of the substring, adjust the source string to start
    # from subsequent occurences of the substring and keep
    # keep count of these occurences
    _st = st[::]
    start = _st.index(sub)
    cnt = 0

    while start is not None:
        cnt += 1
        try:
            _st = _st[start + len(sub) - 1:]
            start = _st.index(sub)
        except (ValueError, IndexError):
            return cnt

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