Подсчитайте гласные из списка слов и верните число в виде списка - PullRequest
0 голосов
/ 09 октября 2018

Я просто хочу определить функцию number_of_vowels, которая возвращает количество гласных в строке.

Мой код указан ниже:

vowels='aeiou'
def number_of_vowels(word):
    return[len([letter.lower() for letter in word if letter in vowels])]
names = ["Ben", "April", "Zaber", "Alexis", "McJagger", "J.J.", "Madonna"]
number_of_vowels(names)

Я получил только [0] в моем результате.Не уверен, почему

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Я бы использовал regular expressions и list comprehension для этой задачи.

import re
names = ["Ben", "April", "Zaber", "Alexis", "McJagger", "J.J.", "Madonna"]
[len(re.findall('a|e|i|o|u', name.lower())) for name in names]
>>> [1, 2, 2, 3, 2, 0, 3]

Дайте мне знать, если это вам помогло.

0 голосов
/ 09 октября 2018

Давайте рассмотрим, почему вы получаете [0].Вы возвращаете список с одним элементом, который является len списка, сгенерированного вашим списком [letter.lower() for letter in word if letter in vowels].

Что делает это понимание списка?Он создает строчные слова для каждого слова в вашем списке слов, но только если он находится в vowels.Поскольку ни одно из слов в вашем списке слов не является in aeiou, этот список пуст.

Возможно, вы хотели написать его следующим образом:

def number_of_vowels(word):
    return len([letter.lower() for letter in word if letter.lower() in vowels])

names = ["Ben", "April", "Zaber", "Alexis", "McJagger", "J.J.", "Madonna"]    
vowel_count = [number_of_vowels(name) for name in names]

Если нет, вы, безусловно, можете обратиться кРешение @ jpp, которое круто.

0 голосов
/ 09 октября 2018

Вы вводите список, но ваша логика подходит только для одной строки:

number_of_vowels('Bean')  # [2]

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

Чтобы сделать это, просто добавьте дополнительное предложение for в ваше понимание списка:

def number_of_vowels(words):
    return [len([letter for letter in word if letter.lower() in vowels]) \
            for word in words]

number_of_vowels(names)  # [1, 2, 2, 3, 2, 0, 3]

Однако обратите внимание, что промежуточные списки не требуются.Вместо этого вы можете использовать sum с выражением генератора, используя преимущества фактов True == 1 и False == 0:

vowels = set('aeiou')

def number_of_vowels(words):
    return [sum(letter.lower() in vowels for letter in word) for word in words]

number_of_vowels(names)  # [1, 2, 2, 3, 2, 0, 3]

Обратите внимание на пару дополнительных изменений для улучшения вашего алгоритма:

  1. Проверьте letter.lower() in vowels вместо того, чтобы просто создавать список строчных букв.В противном случае гласные как заглавные буквы, например, в «апреле», будут игнорироваться.
  2. Преобразуйте ваши гласные в set для O (1) сложности поиска.
...