2016-02-13 49 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 –