2015-03-30 83 views
-1

我试图计算字符串列表列表中的元音字符串数量。我不确定我做错了什么。任何帮助,将不胜感激。在字符串列表列表中计算元音字符串的数量

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

那么究竟是怎么回事?你得到什么输出,你期望得到什么? – 2015-03-30 19:57:38

+0

不要使用'list'作为参数。 – 2015-03-30 19:59:00

+0

@MartijnPieters我越来越0,当我应该得到2. – Ingrid 2015-03-30 20:01:54

回答

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 

我使用的名称,而不是lstlist不掩盖内置类型。当您确定项目中确实至少存在一个元音时,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 

或者您可以通过lowercasing该项目,并只为小写元音测试减少测试次数使用带发生器表达式的any() function;它将执行与for循环相同的操作,其中break;退出时早匹配的元音已经发现:

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 

如果使用sum() function可以折叠计算的话到

def count_vowels(lst): 
    vowels = set('aeiou') 
    return sum(1 
     for sublist in lst 
     for item in sublist 
     if vowel.intersection(item.lower())) 
+2

Ey!马蒂,'列表'作为变量! – 2015-03-30 20:02:14

+1

@BhargavRao:所有好东西都需要时间。 – 2015-03-30 20:02:33

+0

这个函数可以用'any'和'sum'函数简化为两行。 – 2015-03-30 20:05:45

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 

一切都将正常工作,给你找哪个一个更快。

+0

'len(...)> 0'可以完全删除;布尔上下文中的空集是错误的。 – 2015-03-30 20:13:06

+0

确实如此,但OP对于一个简单的程序已经遇到了麻烦,所以我认为这种冗长的语义更容易理解。 – vermillon 2015-03-30 20:36:13

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内置方法。