从单词列表中计算元音,然后将数字作为列表返回

时间:2018-10-08 22:58:51

标签: python string python-3.x list list-comprehension

我只想定义一个函数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 :(得分:3)

您正在馈送列表,但是您的逻辑仅适用于单个字符串:

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]

但是,请注意,不需要中介列表。您可以使用sumTrue == 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)查找的复杂性。

答案 1 :(得分:1)

我将使用regular expressionslist 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]

让我知道这是否对您有帮助。

答案 2 :(得分:0)

让我们检查一下为什么您得到[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的解决方案。