Подсчет слов, содержащих определенную букву
Задача была написать функцию с именем
mylist = ['fortran', 'basic', 'java', 'python', 'c++']
letter = 'a'
a_list = []
def count_letter(mylist):
count = 0
for i in range(len(mylist)):
if letter in i:
count += 1
a_list.append(i)
return a_list
print(len(a_list))
Результат - нет результата. Компилятор Online-python возвращает ответ ** процесс завершен - код возврата: 0 ** Мой вопрос - что я мог пропустить или неправильно расположить, этот цикл не работает. Я хочу понять это для себя. В учебных пособиях я нашел одну конструкцию, которая возвращает правильный ответ (и выглядит очень элегантно и компактно), но не имеет функции, так что это не совсем то, что нам нужно было писать:
mylist = ['fortran', 'basic', 'java', 'python', 'c++']
letter = 'a'
res = len ([ele for ele in mylist if letter in ele])
print ('Amount of words containing a: ' +str(res))
Вот ответ системы:
Подскажите, пожалуйста, что я должен проверить в коде №1.
4 ответа
Я обнаружил несколько ошибок в вашем коде:
Когда вы выполняете for i in range(len(mylist)), вы фактически перебираете числа 1,2, ... вместо элементов mylist. Таким образом, вы должны использовать «for i in mylist» для циклического перебора элементов массива mylist.
Когда вы возвращаетесь из функции, код, следующий за возвратом, не выполняется. Поэтому вам нужно сначала распечатать его, а затем вернуться из функции.
Не забудьте вызвать функцию. В противном случае функция не будет выполнена.
Нет необходимости в переменной count, так как вы можете получить доступ к длине с помощью метода len.
mylist = ['fortran', 'basic', 'java', 'python', 'c++']
letter = 'a'
a_list = []
def count_letter(mylist):
for i in mylist:
if letter in i:
a_list.append(i)
print(len(a_list))
return a_list
print(count_letter(mylist))
Всего наилучшего в вашем путешествии!
Лично я считаю, что исходный код Python легче читать, когда все делается с отступом в четыре пробела. Итак, вот ваша функция снова с более широким отступом:
def count_letter(mylist):
count = 0
for i in range(len(mylist)):
if letter in i:
count += 1
a_list.append(i)
return a_list
print(len(a_list))
for i in range(...)
будет перебирать набор целых чисел. Итак, будет принимать новое целочисленное значение для каждой итерации цикла. Сначала будет
0
, тогда
1
на следующей итерации и т. д.
Затем вы спрашиваете
if letter in i:
. Это никогда не может быть правдой. представляет собой строку и является целым числом. Строка никогда не может быть целым числом, поэтому этот оператор if никогда не будет выполнен. Скорее, вы хотите проверить, есть ли
letter
находится в текущем слове (ое слово в списке). Оператор if должен гласить:
if letter in mylist[i]:
...
Где текущее слово.
Затем вы увеличиваете и добавляете
i
к . Вы, вероятно, хотели добавить
mylist[i]
к, но я не понимаю, зачем тебе вообще нужно
a_list
. Вам просто нужно, так как это отслеживает, сколько слов вы встретили на данный момент, для которых выполняется условие.
count
также является переменной, которую вы должны возвращать в конце, поскольку это цель функции: вернуть количество слов (а не самих слов), содержащих определенную букву.
Кроме того, как ваш финал
print
Оператор с отступом делает его частью тела функции. Однако это после символа, что означает, что у него никогда не будет возможности напечатать. Когда вы используете
return
внутри функции он завершает функцию, и поток выполнения возвращается в то место, из которого функция была первоначально вызвана.
Последнее изменение, которое необходимо применить, заключается в том, что ваша функция должна принимать букву для поиска в качестве параметра. Сейчас ваша функция принимает только один параметр - список слов для поиска.
Вот изменения, которые я бы применил к вашему коду:
def count_letter(words, letter): # I find 'words' is a better name than 'mylist'.
count = 0
for i in range(len(words)):
current_word = words[i]
if letter in current_word:
count += 1
return count
Вот как вы можете использовать эту функцию:
words = ["hello", "world", "apple", "sauce"]
letter = "e"
count = count_letter(words, letter)
print("The letter '{}' appeared in {} words.".format(letter, count))
Выход:
The letter 'e' appeared in 3 words.
Я думаю, что «берет» означает, что функция должна быть определена с двумя параметрами: words_list и letter:
def count_letter(words_list, letter):
Алгоритм на естественном языке может быть таким: дайте мне сумму слов, где буква присутствует для каждого слова в списке слов.
В Python это можно выразить как:
def count_letter(words_list, letter):
return sum(letter in word for word in words_list)
Некоторое объяснение:
letter in word
возвращает логическое значение (True или False), а в Python bools являются подклассом целого числа (True равно 1, а False равно 0). Если буква находится в слове, результатом будет 1, в противном случае - 0. Суммирование результатов дает количество слов, в которых присутствует буква.
Я прочитал все ваши ответы, некоторые важные моменты, которые я записал, сегодня снова сел со своим кодом, и после еще нескольких попыток он сработал ... Итак, окончательная версия выглядит так:
words = ['fortran', 'basic', 'java', 'python', 'c++']
letter = "a"
def count_letter(words, letter):
count = 0
for word in words:
if letter in word:
count += 1
return count
print(count_letter((words),letter))
Ответ системы:
3
Что для меня пока не очевидно: правильные отступы (они тоже были частью проблемы) и дополнительная пара круглых скобок вокруг
words
в
print
линия. Но это приходит с обучением.
Еще раз, спасибо!