我正在尝试根据字符串列表列出其中带元音的字符串数。我不确定我做错了什么。任何帮助将不胜感激。
def count_vowels(list):
""" (list of list of str) -> int
Return the number of vowel-inclusive strings in a list of list of str.
>>> list = [['X', 'OW1'], ['Z', 'AH1', 'R']]
>>> count_vowels(list)
2
"""
for sublist in list:
num_vowels = 0
for item in sublist:
if item in "aeiouAEIOU":
num_vowels += 1
return num_vowels
答案 0 :(得分:3)
每个item
都是一个完整的字符串。在AH1
中找不到"aeiouAEIOU"
,因为元音字符串中没有这样的子字符串。
您还要重置每个子列表的num_vowels
总计,因此您只能在返回值时获得最后一个元素的总数。
你可以遍历每个元音并单独测试它们:
def count_vowels(lst):
num_vowels = 0
for sublist in lst:
for item in sublist:
for vowel in "aeiouAEIOU":
if vowel in item:
num_vowels += 1
break
return num_vowels
我使用名称lst
代替list
来掩盖内置类型。当您确定项目中确实至少有一个元音时,break
会结束for vowel
循环。
这并不是那么有效。您可以通过小写项目来减少测试次数,并仅测试小写元音:
def count_vowels(lst):
num_vowels = 0
for sublist in lst:
for item in sublist:
item = item.lower()
for vowel in "aeiou":
if vowel in item:
num_vowels += 1
break
return num_vowels
您可以使用设置交叉点来查找是否与元音集相交:
def count_vowels(lst):
num_vowels = 0
vowels = set('aeiou')
for sublist in lst:
for item in sublist:
if vowel.intersection(item.lower())
num_vowels += 1
return num_vowels
或将any()
function与生成器表达式一起使用;它会与带有for
的{{1}}循环做同样的事情;当找到匹配的元音时,它会提前退出:
break
如果您使用sum()
function,则可以将字词计入
def count_vowels(lst):
num_vowels = 0
for sublist in lst:
for item in sublist:
item = item.lower()
if any(vowel in item for vowel in "aeiou")
num_vowels += 1
return num_vowels
答案 1 :(得分:1)
你试图通过s in "aeiouAEIOU"
找到一个单词是否有元音,这与“字符串有元音”不一样。你可以这样做:
if any(c in item for c in "aeiouAEIOU"):
num_vowels += 1
或者你可以这样做:
if len(set(item) & set("aeiouAEIOU")) > 0: #this may be faster if you precompute set("aeiouAEIOU")
num_vowels += 1
或者如果你想使用正则表达式:
r = re.compile("[aeiouAEIOU]") #compute this one out of your loop
if r.search(item):
num_vowels += 1
一切都会奏效,由你决定哪一个更快。
答案 2 :(得分:0)
只需将列表清单打包到一个列表中,然后检查元音:
def count_vowels(data):
data = itertools.chain.from_iterable(data) # data is first arg
return sum(1 for i in data if any(j in i for j in 'aeiouAEIOU'))
在第一行中,嵌套列表将生成一个列表。第二行检查每个项目中的任何元音,使用sum
和any
内置方法返回元音检查中测试为阳性的项目总和。