Я пишу код, где вы вводите строку (i) и подстроку (sb), и код должен подсчитывать количество раз, когда подстрока появляется в строке, с перекрытием.
Код работает, если вы вводите строку "AAAA" и смотрите "A" ((возвращает правильную сумму, 4), но если вы введете "ADAM" и ищите "A", он застревает в бесконечном цикле.
Для жизни меня я не могу решить эту проблему.
i = input("Enter a string:")
sb = input("Enter a substring:")
count = 0
x = 0 #index from the string found
idxTotal = len(i)
while True:
i.find(sb,x)
if x != idxTotal:
count += 1
x = i.find(sb,x)+1
else:
break
print(count)
Я думаю, вы делаете слишком сложным. В общем, вы должны проверить в while
цикл, который мы не достигли конца строки. Кроме того, вы должны гарантировать прогресс, увеличивая значение смещения.
Поэтому мы можем написать это так:
x = i.find(sb)
n = 0
while x >= 0:
n += 1
x = i.find(sb, x+1)
# here n is the number of occurrences
print(n)
Итак, сначала мы выполняем i.find(sb)
чтобы найти первое вхождение, и мы устанавливаем n
(счет) на ноль, каждый раз, когда x >= 0
, мы нашли следующее вхождение, поэтому мы увеличиваем n
, а затем мы найдите следующее происшествие.
Мы продолжаем делать это до .find(..)
пор, пока .find(..)
вернет -1
. В этом случае в while
цикл остановится, и n
будет содержать количество элементов.
Например:
>>> i = 'ADAM'
>>> sb = 'A'
>>> x = i.find(sb)
>>> n = 0
>>> while x >= 0:
... n += 1
... x = i.find(sb, x+1)
...
>>> print(n)
2
Это также выполняет подсчет совпадений, например:
>>> i = 'AAADAAAAAM'
>>> sb = 'AAA'
>>> x = i.find(sb)
>>> n = 0
>>> while x >= 0:
... n += 1
... x = i.find(sb, x+1)
...
>>> print(n)
4
Итак, здесь для 'AAADAAAAAM'
есть четыре матча с 'AAA'
:
AAADAAAAAM
1 AAA
2 AAA
3 AAA
4 AAA
Поскольку метод find возвращает -1, когда подстрока не найдена, я использовал бы это, чтобы закончить цикл while.
Выполняя следующее, вы считаете, пока подстрока больше не будет найдена:
i = input("Enter a string:")
sb = input("Enter a substring:")
count = 0
x = 0
while True:
x = i.find(sb,x)+1 #x will be 0 if sb isn't found
if x != 0: #if x = 0 the while loop will end
count += 1
else:
break
print(count)
Ты можешь попробовать,
some_string = input("Enter a string:")
some_substring = input("Enter a substring:")
total = 0
for index, some_char in enumerate(some_string):
# print(index, some_char) # try this to see what comes in the loop
if some_string[index:].startswith(some_substring):
total = total + 1
print(total)
Он более изящный, избегая использования while (True), и i.find вернет -1, поэтому вы будете застревать в бесконечном цикле. Это позволит вам избежать ручного индексирования с помощью while. :)
Это будет работать для "ADAM" и "A" с правильными 2, а также для других подстрок, таких как "DABCEABC" и "ABC" с правильными 2, "AAADAAAAAM" и "AAA" с правильными 5.
Ниже код будет работать в соответствии с вашими потребностями:
i.count(sb,0,len(i))
i.find(sb,x)
не найдет вашу подстроку, он вернет-1
, что вернет вас в начало строки. Вы должны проверить, что он вернул, и разорвать ваш цикл, если он вернет-1
.