使用字符串列表列表中的元音计数字符串数

时间:2015-03-30 19:57:00

标签: python python-3.x

我正在尝试根据字符串列表列出其中带元音的字符串数。我不确定我做错了什么。任何帮助将不胜感激。

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                

3 个答案:

答案 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'))

在第一行中,嵌套列表将生成一个列表。第二行检查每个项目中的任何元音,使用sumany内置方法返回元音检查中测试为阳性的项目总和。