পাইথনের একটি স্ট্রিংয়ের মধ্যে প্রদত্ত সাবস্ট্রিং উপস্থিত থাকার সংখ্যাটি আমি কীভাবে গণনা করতে পারি?
উদাহরণ স্বরূপ:
>>> 'foo bar foo'.numberOfOccurrences('foo')
2
পাইথনের একটি স্ট্রিংয়ের মধ্যে প্রদত্ত সাবস্ট্রিং উপস্থিত থাকার সংখ্যাটি আমি কীভাবে গণনা করতে পারি?
উদাহরণ স্বরূপ:
>>> 'foo bar foo'.numberOfOccurrences('foo')
2
উত্তর:
string.count(substring)এর মতো:
>>> "abcdabcva".count("ab")
2
মন্তব্যে ইঙ্গিত হিসাবে, ওভারল্যাপিং-এর অঘটনগুলির জন্য এটি করার উপায় । যদি আপনাকে ওভারল্যাপিংয়ের ঘটনাগুলি গণনা করতে হয়, তবে আপনি উত্তরগুলি আরও ভাল করে পরীক্ষা করতে পারেন: " পাইথন রেজেক্স সমস্ত ওভারল্যাপিং মিল খুঁজে পাবে? ", বা নীচে আমার অন্য উত্তরটি পরীক্ষা করে দেখুন।
"GCAAAAAG".count("AAA")যা 1 দেয়, যখন সঠিক উত্তরটি 3?
countস্পষ্টতই অ-ওভারল্যাপিং ম্যাচের জন্য - যা প্রায়শই কেউ করতে চায়। stackoverflow.com/questions/5616822/... ম্যাচ ওভারল্যাপিং সাথে চুক্তি - কিন্তু একটি সহজ, ব্যয়বহুল, তাহলে অভিব্যক্তি:sum("GCAAAAAGH"[i:].startswith("AAA") for i in range(len("GCAAAAAGH")))
string.count(substring1) + string.count(substring2)। তবে মনে রাখবেন যে সাবস্ট্রিংগুলি প্রচুর পরিমাণে থাকলে এটি একটি কার্যকর পদ্ধতি নয় কারণ প্রতিটি স্ট্রিংয়ের গণনা করার জন্য মূল স্ট্রিংয়ের উপরে একটি পুনরাবৃত্তি প্রয়োজন।
''.join([substring1, substring2]).count(pattern)উপরে উল্লিখিত সমাধানের চেয়ে কার্যকর is আমি টাইমিট ব্যবহার করে পরীক্ষা করেছি।
s = 'arunununghhjj'
sb = 'nun'
results = 0
sub_len = len(sb)
for i in range(len(s)):
if s[i:i+sub_len] == sb:
results += 1
print results
আপনার সত্যিকারের অর্থটি নির্ভর করে আমি নিম্নলিখিত সমাধানগুলি প্রস্তাব করছি:
আপনার অর্থ স্থান পৃথক সাব-স্ট্রিংগুলির একটি তালিকা এবং আপনি জানতে চান যে সমস্ত সাব-স্ট্রিংয়ের মধ্যে সাব-স্ট্রিং অবস্থানের সংখ্যাটি কী:
s = 'sub1 sub2 sub3'
s.split().index('sub2')
>>> 1আপনি স্ট্রিংয়ের উপ-স্ট্রিংয়ের চর-অবস্থান বলতে চাইছেন:
s.find('sub2')
>>> 5আপনি (অ ওভারল্যাপিং) মানে গন্য সু bstring চেহারা:
s.count('sub2')
>>> 1
s.count('sub')
>>> 3s.find("su")এবং ভাবছি কেন আপনি পেয়েছেন 0? আচ্ছা এই উপ-স্ট্রিং এর প্রথম সূচক "su"মধ্যে s। ব্যবহার করে দেখুন "ub"এবং আপনি হবে পেতে 1, যেমন চেষ্টা "z"এবং আপনি পাবেন -1কোন সাবস্ট্রিং হিসেবে পাওয়া যায় নি।
প্রদত্ত স্ট্রিংয়ে ওভারল্যাপিং সাব-স্ট্রিংয়ের সন্ধানের সর্বোত্তম উপায় হল পাইথন নিয়মিত এক্সপ্রেশন ব্যবহার করা এটি নিয়মিত এক্সপ্রেশন লাইব্রেরি ব্যবহার করে সমস্ত ওভারল্যাপিং মিল খুঁজে পাবে। এখানে এটি কীভাবে বাম করবেন তা হল সাবস্ট্রিং এবং ডানদিকে আপনি ম্যাচের জন্য স্ট্রিং সরবরাহ করবেন
print len(re.findall('(?=aa)','caaaab'))
3
পাইথন 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
আমি নিজেই এই অ্যালগরিদম পরীক্ষা করেছি এবং এটি কার্যকর হয়েছে।
আপনি দুটি উপায় ব্যবহার করে ফ্রিকোয়েন্সি গণনা করতে পারেন:
ব্যবহার count()মধ্যে str:
a.count(b)
বা, আপনি ব্যবহার করতে পারেন:
len(a.split(b))-1
aস্ট্রিংটি কোথায় রয়েছে এবং bস্ট্রস্ট্রিং যার ফ্রিকোয়েন্সি গণনা করতে হবে।
পদ্ধতির সাথে জড়িত বর্তমানের সেরা উত্তরটি 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
দৃশ্য 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
ধন্যবাদ!
প্রশ্নটি খুব স্পষ্ট নয়, তবে আমি কী জবাব দিচ্ছি, ভূপৃষ্ঠে, জিজ্ঞাসা করছি।
একটি স্ট্রিং এস, যা এল অক্ষর দীর্ঘ, এবং যেখানে এস [1] স্ট্রিংয়ের প্রথম অক্ষর এবং এস [এল] সর্বশেষ অক্ষর, নিম্নলিখিত সাবস্ট্রিংগুলি রয়েছে:
সুতরাং, দৈর্ঘ্যের একটি স্ট্রিংয়ের মধ্যে 0.5 * এল * (এল + 1) + 1 সাবস্ট্রিং রয়েছে এল। পাইথনের যে অভিব্যক্তিটি রেন্ডার করে এবং আপনার স্ট্রিংয়ের মধ্যে উপস্থিত সাবস্ট্রিংগুলির সংখ্যা রয়েছে।
একটি উপায় ব্যবহার করা হয় re.subn। উদাহরণস্বরূপ, যে 'hello'কোনও ক্ষেত্রে আপনি করতে পারেন এর সংঘটনগুলির সংখ্যা গণনা করতে:
import re
_, count = re.subn(r'hello', '', astring, flags=re.I)
print('Found', count, 'occurrences of "hello"')
আমি আমার গৃহীত উত্তরটিকে "এটি করার সহজ এবং সুস্পষ্ট উপায়" হিসাবে রাখব - তবে এতে ওভারল্যাপিংয়ের ঘটনাগুলি আচ্ছাদন করে না। সেগুলি নির্বিঘ্নে টুকরোগুলির একাধিক চেকিংয়ের সাথে করা যায় - যেমনটি: যোগফল ("জিসিএএএএএএজিএইচ" [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))
ওভারল্যাপিং ঘটনা:
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
ওভারল্যাপিং কাউন্টের জন্য আমরা ব্যবহার করতে পারি:
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)
কীভাবে একটি তালিকা বোঝার সাথে এক-লাইনার? প্রযুক্তিগতভাবে এর 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])
আপনি যদি সমস্ত উপ-স্ট্রিং (ওভারল্যাপযুক্ত সহ) গণনা করতে চান তবে এই পদ্ধতিটি ব্যবহার করুন।
import re
def count_substring(string, sub_string):
regex = '(?='+sub_string+')'
# print(regex)
return len(re.findall(regex,string))
আপনি যদি কোনও স্ট্রিংয়ের ভিতরে সাবস্ট্রিংয়ের গণনা জানতে চান; নীচে কোড ব্যবহার করুন। কোডটি বোঝা সহজ তাই আমি মন্তব্যগুলি এড়িয়ে গেছি। :)
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
আমি নিশ্চিত না যে এটি ইতিমধ্যে কিছু লক্ষ্য করা হয়েছে কিনা তবে আমি এটি 'ডিসপোজেবল' শব্দের সমাধান হিসাবে ভেবেছিলাম:
for i in xrange(len(word)):
if word[:len(term)] == term:
count += 1
word = word[1:]
print count
শব্দটি যেখানে আপনি সন্ধান করছেন এবং শব্দটি সেই শব্দটি যা আপনি সন্ধান করছেন
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)
import re
d = [m.start() for m in re.finditer(seaching, string)]
print (d)
এটি স্ট্রিংয়ে প্রদর্শিত সাব স্ট্রিংয়ের সংখ্যা এবং সূচকগুলি প্রদর্শন করে।
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)
ডাউনটাতে ঝুঁকিপূর্ণ কারণ 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
স্থান সীমিতকরণ সহ একটি সাধারণ স্ট্রিংয়ের জন্য ডিক্ট ব্যবহার করা খুব দ্রুত হবে, দয়া করে নীচের মত কোডটি দেখুন
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')
আপনি startswithপদ্ধতিটি ব্যবহার করতে পারেন :
def count_substring(string, sub_string):
x = 0
for i in range(len(string)):
if string[i:].startswith(sub_string):
x += 1
return x
লজিকের নীচে সমস্ত স্ট্রিং এবং বিশেষ অক্ষরের জন্য কাজ করবে
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"))
পাইথন 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)
#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)
এটি স্ট্রিংয়ের সমস্ত সংঘটন (ওভারল্যাপিং) এর একটি তালিকা তৈরি করে এবং সেগুলি গণনা করে
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])
এখানে এমন একটি সমাধান রয়েছে যা অ-ওভারল্যাপিং এবং ওভারল্যাপিং উভয় ক্ষেত্রেই কাজ করে। স্পষ্ট করার জন্য: একটি ওভারল্যাপিং সাবস্ট্রিং হ'ল এমন একটি যাঁর শেষ চরিত্রটি তার প্রথম চরিত্রের সাথে সমান।
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