Określanie, ile razy podciąg występuje w ciągu znaków w Pythonie


Próbuję dowiedzieć się, ile razy ciąg występuje w ciągu. Na przykład:
nStr = '000123000123'

Powiedzmy, że ciąg, którego chcę szukać, to 123. Oczywiście dzieje się to dwukrotnie w nStr, ale mam problem z zaimplementowaniem tej logiki w Pythonie. Co mam w tej chwili:
pattern = '123'
count = a = 0
while pattern in nStr[a:]:
a = nStr[a:].find(pattern)+1
count += 1
return count

Odpowiedź, którą powinien zwrócić, to 2. W tej chwili utknąłem w nieskończonej pętli.
Właśnie dowiedziałem się, że wykres jest znacznie lepszym sposobem, aby to zrobić, ale czy z ciekawości ktoś widzi sposób, aby wyglądało to tak, jak ja już mam?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Posługiwać się
str.count
http://docs.python.org/library ... count
:
>>> nStr = '000123000123'
>>> nStr.count('123')
2

Wersja robocza twojego kodu:
nStr = '000123000123'
pattern = '123'
count =0
flag=True
start=0
while flag:
a = nStr.find(pattern,start) # find() returns -1 if the word is not found,
#start i the starting index from the search starts(default value is 0)
if a==-1: #if pattern not found set flag to False
flag=False
else: # if word is found increase count and set starting index to a+1
count+=1
start=a+1
print(count)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Problem z
count ()
i przedstawionymi tutaj metodami dotyczy nakładania się podciągów.
Na przykład:
„aaaaaa” .count („aaa”)
zwraca 2
Jeśli chcesz, aby zwracał 4 [
(aaa) aaa, a (aaa) aa, aa (aaa) a, aaa (aaa)
], możesz spróbować czegoś takiego:
def my_count(string, substring):
string_size = len(string)
substring_size = len(substring)
count = 0
for i in xrange(0,string_size-substring_size+1):
if string[i:i+substring_size] == substring:
count+=1
return countmy_count("aaaaaa", "aaa")
# 4

Nie wiem, czy istnieje lepszy sposób, aby to zrobić, ale wysłanie wiadomości ma na celu jedynie wyjaśnienie, jak działa
count ()
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

import repattern = '123'n =re.findall(pattern, string)

Można powiedzieć, że „wzorzec” podłańcucha pojawia się len (n) razy w „łańcuchu”.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli szukasz sposobu rozwiązania tego problemu w przypadku nakładających się przypadków.
s = 'azcbobobegghaklbob'
str = 'bob'
results = 0
sub_len = len(str)
for i in range(len(s)):
if s[i:i+sub_len] == str:
results += 1
print (results)

Daje wynik 3, ponieważ: [azc (bob) obegghaklbob] [azcbo (bob) egghaklbob] [azcbobobegghakl (bob)]
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jestem całkiem nowicjuszem, ale myślę, że to dobre rozwiązanie? może?
def count_substring(str, sub_str):
count = 0
for i, c in enumerate(str):
if sub_str == str[i:i+2]:
count += 1
return count
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

string.count (podciąg) nie jest przydatny w przypadku nakładania się.
Twoje podejście:
def count_substring(string, sub_string): length = len(string)
counter = 0
for i in range(length):
for j in range(length):
if string[i:j+1] == sub_string:
counter +=1
return counter
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Nie zmieniasz
a
przy każdej pętli. Musisz umieścić:
a += nStr[a:].find(pattern)+1

...
zamiast:
a = nStr[a:].find(pattern)+1
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

<pre class="lang-py prettyprint-override">
def countOccurance(str,pat):
count=0
wordList=str.split()
for word in wordList:
if pat in word:
count+=1
return count
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

def count_substring(string, substring):
c=0
l=len(sub_string)
for i in range(len(string)):
if string [i:i+l]==sub_string:
c=c+1
return c
string=input().strip()
sub_string=input().strip()count= count_substring(string,sub_string)
print(count)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jak wspomnieli @ João Pesce i @gaurav,
count ()
nie jest przydatne w przypadku nakładających się podciągów, spróbuj ...
def count_substring(string, sub_string):
c=0
for i in range(len(string)):
if(string[i:i+len(sub_string)]==sub_string):
c = c+1
return c
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zwykle używam enumerate do tego rodzaju problemów:
def count_substring(string, sub_string):
count = 0
for i, j in enumerate(string):
if sub_string in string[i:i+3]:
count = count + 1
return count
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

graph def (podciąg, ciąg):
count = 0
ind = string.find(sub_string)while True:
if ind > -1:
count += 1
ind = string.find(sub_string,ind + 1)
else:
break
return count

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się