2016-02-13 87 views
0

我是python的新手,在排除脚本时遇到了一些困难。Python:从列表中计数元音

我的任务是创建一些函数,它接受一个字符串列表并返回整个列表中元音的数量。

的比赛计划,我试图遵循的是:

  1. 合并列表元素连接成一个字符串
  2. 创建一个循环测试字符串元素是元音
  3. 使用计数器变量跟踪元音的字符串
  4. 打印计数器变量的值,当循环结束

我合作德并不高雅,但它也行不通。

def vowelCounter(listName): 
    new = ''.join(listName) 
    n = len(new) 
    count = 0 
    vowels = 'aeiouAEIOU' 
    i = 0 
    for i in range(0,n): 
     while i < n: 
      if new[i] in vowels: 
       count += 1 
       i += 1 
       return 
      print count 
      return 
     return 
    return 

print(vowelCounter(["terrapin","station","13points"])) 

请原谅我可能有的任何愚蠢的错误。我一定会感谢您提供的任何帮助!

+0

的可能的复制[计数元音字符串的Python](http://stackoverflow.com/questions/19967001/count-vowels-in-string-python) – Obsidian

+1

在发布问题之前,您绝对应该至少学习一门语言的基础知识。 –

回答

2

首先,我们有一些一般的语法问题。

  1. return立即退出函数;它不只是“结束循环”。
  2. 在循环上面初始化i0毫无意义。 for循环本身将自动将i设置为range()返回列表中的当前值。
  3. while i < n是不必要的;对于列表中的每个字符,都不需要再次遍历字符串。
  4. 没有必要手动增加i; for会自动为你做这个。
  5. 你是print函数内的值,但你也试图打印函数的返回值(但它不返回任何东西!)。

所以,如果我们固定的这些问题,我们希望有这样的事情:

def vowelCounter(listName): 
    vowels = 'aeiouAEIOU' 
    new = ''.join(listName) 
    count = 0 

    for i in range(0, len(new)): 
     if new[i] in vowels: 
      count += 1 

    return count 

但是Python中还允许for循环只是通过字符串的每个字符重复,所以我们不”吨需要range()len()可言:

def vowelCounter(listName): 
    vowels = 'aeiouAEIOU' 
    count = 0 

    for char in ''.join(listName): 
     if char in vowels: 
      count += 1 

    return count 

但我们可以让这甚至awesomer,与List Comprehensionssum()功能!

def vowelCounter(listName): 
    vowels = 'aeiouAEIOU' 
    count = sum([1 for char in ''.join(listName) if char in vowels]) 
    return count 

我们基本上是在这里做的,是使1个列表每个字母是元音(如果它不是一个元音,我们不会把任何东西在我们新的列表)。然后我们使用sum()将列表中的所有数字(1)加起来,这是我们的元音总数。

或者,我们甚至可以做这一个班轮:

def vowelCounter(listName): 
    return sum([1 for char in ''.join(listName) if char in 'aeiouAEIOU']) 
+1

谈论优雅...感谢您的好解释! –

+0

没问题,谢谢,很高兴帮助! Python非常灵活和富有表现力,并且总是有一些正确的方法,但是目标通常是找到一个简单,高效但也可读的正确组合。尽管如此,我们绝对是在正确的轨道上! – Will

+1

@MattD如果你认为这个答案很好,并且正确(当然),你应该继续并接受它,:) – Tacocat

0

的代码主要是确定...但是

  • 一个for i in ...自动递增i,所以不需要i += 1
  • for做的循环......没有必要把另一while循环里面
  • returnreturn退出该功能,您应该只在最后使用它来返回已计算的结果return count
+0

感谢您的快速和有益的回复!我会做出改变,看看我能解决什么问题。 –

+0

我闻到一只老鼠!即使这个不错的小答案也会倒退。无论如何,我正在尽我所能,把它带到地球上! –

0
>>> import re 
>>> vowels = re.compile('[AEIOU]', re.IGNORECASE) 
>>> 
>>> def vowelCounter(listName): 
...  return len(vowels.split("".join(listName)))-1 
... 
>>> vowelCounter(["terrapin","station","13points"]) 
8 
>>> vowelCounter(["terrapin","station","13pOInts"]) 
8 
+0

美丽!非常整齐,聪明。 +1,但OP希望更天真的答案可能':-)' –

+0

正则表达式对于这样的问题也不是非常有效。 – Will

1

您提供的一步一步的逻辑是正确的。
但是,您发布的代码不符合逻辑并且不正确。

尝试下面的代码来代替:

def vowelCounter(listName): 
    string = ''.join(listName) 
    count = 0 
    vowels = 'aeiouAEIOU' 
    for ch in string: 
     if ch in vowels: 
      count += 1 
    return count 

print(vowelCounter(["terrapin","station","13points"])) 
+0

打印是否需要显示函数返回的值? –

+0

是的,该函数返回元音计数。所以需要打印以显示从函数返回的值。 –

+0

但是,您可以直接从函数内部打印元音计数,方法是将最后一行'return count'替换为以下两行:print count和return –