Каждый item
является полной строкой. AH1
не встречается в "aeiouAEIOU"
, поскольку в строке гласного нет такой подстроки.
Вы также сбросите num_vowels
всего за подсписок, так что вы получите только итоговое значение для последнего элемента к моменту возврата значения.
Вы могли цикл по каждому из гласных и проверить те индивидуально:
def count_vowels(lst):
num_vowels = 0
for sublist in lst:
for item in sublist:
for vowel in "aeiouAEIOU":
if vowel in item:
num_vowels += 1
break
return num_vowels
Я использовал имя lst
вместо list
, чтобы не маскировать встроенного типа. break
завершает цикл for vowel
, когда вы определили, что в нем действительно есть хотя бы один гласный.
Это еще не все, что эффективно. Вы можете уменьшить количество тестов на lowercasing детали и тестирования только для строчной гласные:
def count_vowels(lst):
num_vowels = 0
for sublist in lst:
for item in sublist:
item = item.lower()
for vowel in "aeiou":
if vowel in item:
num_vowels += 1
break
return num_vowels
Вы можете использовать набор перекрестки, чтобы найти, если есть пересечение с гласными набором:
def count_vowels(lst):
num_vowels = 0
vowels = set('aeiou')
for sublist in lst:
for item in sublist:
if vowel.intersection(item.lower())
num_vowels += 1
return num_vowels
или используйте any()
function с выражением генератора; он будет делать то же самое, что и цикл for
с break
; она выходит рано, когда соответствующий гласный было найдено:
def count_vowels(lst):
num_vowels = 0
for sublist in lst:
for item in sublist:
item = item.lower()
if any(vowel in item for vowel in "aeiou")
num_vowels += 1
return num_vowels
Если вы используете sum()
function вы можете свернуть подсчета слов в
def count_vowels(lst):
vowels = set('aeiou')
return sum(1
for sublist in lst
for item in sublist
if vowel.intersection(item.lower()))
Так что же происходит? Какой результат вы получаете и что вы ожидаете получить вместо этого? –
Не используйте 'list' в качестве аргумента. –
@MartijnPieters Я получаю 0, когда мне нужно получить 2. – Ingrid