首页 > 解决方案 > 从单词列表中计算元音并将数字作为列表返回

问题描述

我只想定义一个函数 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]。不知道为什么

标签: pythonstringpython-3.xlistlist-comprehension

解决方案


您正在提供一个列表,但您的逻辑仅适用于单个字符串:

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 == 1False == 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而不是仅仅创建一个小写字母列表。否则元音大写,例如“April”,将被忽略。
  2. 将元音转换set为 O(1) 查找复杂度。

推荐阅读