2016-09-09 3 views
0
s = "abobabobabob" 
total = 0 

for i in range(len(s)): 
    if s[i-1 : i+2] == 'bob': 
     total += 1 

print ('times bob occurs is:' + str(total)) 

Есть ли более простой способ изменить заявление if? Кроме того, может кто-нибудь сказать мне, что делает i-1 : i+2?Подсчет соответствия подстрок в строке

Я написал этот код, чтобы найти вхождения «bob», и я застрял на некоторое время.

+0

Пожалуйста, задайте свой вопрос более полезным названием. – Barmar

+0

Ваш отступ испорчен. Крайне важно получить отступы прямо на Python. – Barmar

+0

См. Http://pythoncentral.io/cutting-and-slicing-strings-in-python/ для объяснения того, что означает 'i-1: i + 2]'. Это струнный срез. – Barmar

ответ

1

Следующий код ищет начальный индекс каждой подстроки 'bob' и добавляет это значение в массив. Переменная total просто возвращает количество значений в этом массиве.

Как однострочника:

total = 0 
s = "abobabobabob" 

total = len([i for i in range(len(s)) if s.find('bob', i) == i]) 

print('times bob occurs is: ' + str(total)) 

распечаток:

times bob occurs is: 3 

--- Вот альтернатива, если вы хотите изменения в ваш for цикла:

total = 0 
s = "abobabobabob" 

for i in range(len(s)): 
    if (s.find('bob', i) == i): 
     total += 1 

print('times bob occurs is: ' + str(total)) 

Печать:

times bob occurs is: 3 
+0

Хороший однострочный +1. Но поскольку он использовал цикл for и имел проблемы с отступом, могу ли я предложить также показать ему, как это сделать, используя регулярный цикл for? –

+0

Добавлена ​​модификация для цикла для решения. – ode2k

1

, если с [я-1: I + 2] == 'боб' проверяет, является ли текущий индекс -1 текущий индекс + 2 'боб'. Это вызовет проблемы, так как я начать с 0 и я-1 является последним элементом списка

попробовать:

s = "abobabobabob" 
total = 0 

for i in range(1,len(s)): 
    if s[i-1 : i+2] == 'bob': 
     total += 1 

есть лучший способ в две строки

s= "abobabobabob" 
print sum( s[i:i+3] =='bob' for i in range(len(s)-2)) 

3 
+0

Я пробовал код OP, и это не вызывало ошибки (после добавления правильного отступа). Я был очень удивлен. –

+0

@ChadDavis не должен. в индексе python может быть отрицательным. s [-1: 2] - пустая строка – galaxyan

+0

сначала проверила ее в IPython, а затем поместила скрипт в файл и выполнила его - все еще работала. Использование Python 3. Это стоит посмотреть. –

2

Ваш if-statement рассматривает подмножество s. Для своего рода ответа на ваш другой вопрос, здесь более простой подход, который изменяется более чем Условный оператор:

import re 

встраиваемых систем поиск

Это библиотека регулярных выражений питона заявления для всех, непересекающихся экземпляров 'bob' и возвращает список с каждым соответствием в качестве элемента; внешний оператор просто подсчитывает количество элементов в списке

len(re.findall('bob',s)) 
1

Использование enumerate()

s = "abobabobabob" 
n = len([i for i, w in enumerate(s) if s[i:i+3] == "bob"]) 

print ('times bob occurs is:', n) 

Проверяется для каждого символа в строке s (по индексу i), если символ + два символа справа равен «bob».


Об вторичный вопрос:

В вашем примере:

s[i-1 : i+2] 

относится к индексу (i) из символов в строке, где s[0] является первым символом, в то время как s[i-1 : i+2] представляет собой фрагмент строки s, от текущего символа -1 (один слева) до текущего символа +2 (второй символ справа).

+0

_Using enumeraste() _ - Вы имеете в виду _enumerate_? –

+0

@ Mr.goosberry 'aste' ate' ate' :) Спасибо за упоминание! –