J'essaie de savoir combien de fois une chaîne se produit dans une chaîne. Par exemple:
nStr = '000123000123'
Disons que la chaîne que je veux trouver est 123. Évidemment, cela se produit deux fois dans nStr, mais je ne parviens pas à implémenter cette logique dans Python. Ce que j'ai en ce moment:
pattern = '123'
count = a = 0
while pattern in nStr[a:]:
a = nStr[a:].find(pattern)+1
count += 1
return count
La réponse devrait être de 2. Je suis coincé dans une boucle infinie pour le moment.
Je viens de me rendre compte que compter est une meilleure façon de le faire, mais par curiosité, est-ce que quelqu'un voit un moyen de le faire similaire à ce que j'ai déjà?
Utilisez str.count
:
>>> nStr = '000123000123'
>>> nStr.count('123')
2
Une version de travail de votre code:
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)
Le problème avec count()
et les méthodes présentées ici est le cas des sous-chaînes qui se chevauchent.
Par exemple: "aaaaaa".count("aaa")
renvoie 2
Si vous voulez qu'il renvoie 4 [(aaa)aaa, a(aaa)aa, aa(aaa)a, aaa(aaa)
], vous pouvez essayer quelque chose comme ceci:
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 count
my_count("aaaaaa", "aaa")
# 4
Je ne sais pas s'il existe un meilleur moyen de le faire, mais nous affichons simplement pour clarifier le fonctionnement de count()
.
import re
pattern = '123'
n =re.findall(pattern, string)
On peut dire que la sous-chaîne 'pattern' apparaît len (n) fois dans 'string'.
Si vous cherchez comment résoudre ce problème pour les cas de chevauchement.
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)
Cela donnera 3 parce que: [azc (bob) obegghaklbob] [azcbo (bob) egghaklbob] [azcbobobegghakl (bob)]
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)
string.count (sous-chaîne) n'est pas utile en cas de chevauchement.
Mon approche:
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
Vous ne changez pas a
à chaque boucle. Vous devriez mettre:
a += nStr[a:].find(pattern)+1
...au lieu de:
a = nStr[a:].find(pattern)+1
Comme mentionné par @ João Pesce et @gaurav, count()
n'est pas utile dans le cas de chevauchement de sous-chaînes, essayez ceci ...
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