2015-10-01 2 views
0

Я пытался подсчитать вхождения слов, которые заканчиваются несколькими суффиксами. Я думал, что endswith примет итерируемый; к сожалению, этого не произошло. Ниже приведен фрагмент кода:TypeError: endswith first arg должен быть str или кортежем str, а не bool

s = 'like go goes likes liked liked liking likes like' 
lst = s.split() 
suffixes = ['s', 'es', 'ies', 'ed', 'ing'] 

counter = 0 
prompt = 'like' 
for x in lst: 
    if x.startswith(prompt) and x.endswith(any(suffix for suffix in suffixes)): 
     counter += 1 

Значение counter должно быть 4 в конце исполнения. Это сообщение об ошибке, которое отображается:

TypeError: endswith first arg must be str or a tuple of str, not bool 

Как я могу заставить вышеуказанный код работать?

+2

Сообщение об ошибке говорит вам * именно то, что проблема есть. * «Я думал, что это приведет к повторению» *, даже если это так, это не то, что вы передаете **. Попробуйте 'x.endswith (кортеж (суффиксы))'. – jonrsharpe

+0

@jonrsharpe При передаче суффиксов в качестве аргумента он берет первые два элемента и оставляет остальные. Я уже это пробовал. – Mohammed

+0

'[x for x in 'like go go любит понравилось понравилось нравится нравится like..split() если x.startswith (' like ') и x.endswith ((' s ',' es ',' ies ',' ed ',' ing '))] 'дает мне' ['нравится', 'нравится', 'нравится', 'нравится']', что и есть то, что я ожидаю. – jonrsharpe

ответ

3

Функция any возвращает значение bool, но для str.startswith требуется строка или кортеж строк.

Вы можете просто преобразовать список в кортеж и передать его startswith:

x.endswith(tuple(suffixes)) 
+0

Я попробовал ваш ответ. 'counter' оценивается только' 4'. Я думаю, что он должен оценивать '5' – Mohammed

+2

@Mohammed почему? '' liking'' не начинается с '' like''. – jonrsharpe

+0

@ Kasramvd, О, да. Ты прав. Ваш ответ правильный. Спасибо за вашу любезную помощь. – Mohammed

Смежные вопросы