Ошибка индекса при попытке подсчета вхождений строки с перекрытием - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь найти количество bob в ls.Я получаю сообщение об ошибке «индекс вне диапазона» в строке 10. И я не могу понять это.i должно быть 3.

s = 'azcbobobegghakl'
ls =[]
for x in s:
    ls.append(x)
    print(ls)

for z in ls:
    count = 0
    i = ls.index("b")
    if z[i] == "b":
        if z[i+1] == "o":
            if z[i+2] == "b":
                count +=1

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

count () функция str в Python.

In [31]: s ='azcbobobegghbobfdfdbob'

In [32]: print(s.count('bob'))
3

, чтобы найти индекс первого вхождения, вы можете использовать функцию index ()

In [34]: print(s.index('bob'))
3

, чтобы найти индексы всехслучаи вы можете использовать повторно модуль Python

import re
In [44]: for val in re.finditer('bob', s):
    ...:     print(val.span()[0])
    ...:
3
12
19
0 голосов
/ 22 сентября 2018

Я просто объясняю, где и почему произошла ошибка.

s = 'azcbobobegghakl'
ls =[]
for x in s:
    ls.append(x)
    print(ls)
#equal to
#ls = list(s)

for z in ls:
    count = 0
    i = ls.index("b")
    print(z) # !!!! z just a single letter,you can not use index on it !!!
    if z[i] == "b":
        if z[i+1] == "o":
            if z[i+2] == "b":
                count +=1

следуйте вашей идее, я думаю, вы хотите написать так:

Но это не правильно , потому что i = ls.index("b") никогда не меняется, вы соответствуете одному слову 15 times

s = 'azcbobobegghakl'
ls =[]

for x in s:
    ls.append(x)
    print(ls)

ls = list(s)
for z in ls:
    count = 0
    i = ls.index("b")
    print(z) # z just a single letter,you can not use index on it
    if ls[i] == "b": #but ls can do this
        if ls[i+1] == "o":
            if ls[i+2] == "b":
                count +=1
print(count)

Будь кратким.

import re
s = 'azcbobobegghakl'
print(len(re.findall("b(?=ob)",s)))
0 голосов
/ 21 сентября 2018

Пытаясь придерживаться метода, который вы пытались сделать, проверяя индексы, вы можете сделать что-то вроде этого:

s = 'azcbobobegghakl'
bob_count = 0 
for idx, item in enumerate(s[:-2]):
    if s[idx: idx+3] == 'bob':
        bob_count += 1

print(bob_count)
(xenial)vash@localhost:~/python/stack_overflow/sept$ python3.7 bob.py
2

Вы должны смотреть, что выиндексируют и то, что вы делаете с этим индексом, если вы смотрите вперед, скажите index +1, а ваш конечный индекс не сработает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...