Подсчет слов, содержащих определенную букву

Задача была написать функцию с именем который берет список слов и определенную букву и возвращает количество слов, в которых эта буква встречается хотя бы один раз. И мы должны использовать петля. Итак, я составил список некоторых языков программирования и написал букву «а» и попытался применить все, что мы узнали до сих пор, плюс несколько интернет-руководств, чтобы понять, как преобразовать человеческую логику в строки кода, но, очевидно, я чего-то упускаю, потому что это не так. не работает :( Вот так сейчас выглядит мой код:

      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 ответа

Я обнаружил несколько ошибок в вашем коде:

  1. Когда вы выполняете for i in range(len(mylist)), вы фактически перебираете числа 1,2, ... вместо элементов mylist. Таким образом, вы должны использовать «for i in mylist» для циклического перебора элементов массива mylist.

  2. Когда вы возвращаетесь из функции, код, следующий за возвратом, не выполняется. Поэтому вам нужно сначала распечатать его, а затем вернуться из функции.

  3. Не забудьте вызвать функцию. В противном случае функция не будет выполнена.

  4. Нет необходимости в переменной 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линия. Но это приходит с обучением.

Еще раз, спасибо!

Другие вопросы по тегам