我只想定义一个函数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]。不知道为什么
答案 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]
但是,请注意,不需要中介列表。您可以使用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]
请注意进一步更改以改进您的算法:
letter.lower() in vowels
而不只是创建一个小写字母列表。否则,将元音作为大写字母,例如在“四月”中,将被忽略。set
,以提高O(1)查找的复杂性。答案 1 :(得分:1)
我将使用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]
让我知道这是否对您有帮助。
答案 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的解决方案。