2016-09-03 5 views
-1

現在、Python 3.5でMITの学部問題を解決しています。 関数のラッパーや関数の定義(代入には奇妙な?)を使わずに、小文字のみを含む文字列に母音の数を数えて印字するPythonスクリプトを書くのが目的です。ファンクションラッパーのない文字列の母音の数を数える方法

def vowels_count(s): 
    i=0 
    counter = 0 
    while(s[i] != " "): 
     if s[i] == "a" or s[i] == "e" or s[i] == "i" or s[i] == "o" or s[i] == "u": 
      counter += 1 
     i = i + 1 
    return(counter) 

は、私は2つの問題を抱えている: 1 /まず、自分自身のコードをしばらく使用しての構造が、最後の1への最初の文字からナビゲートするインデックスの使用に問題があることを満たしていません。デバッガは次のように言っています:index of range 2 /最後に、MIT命令に従わなければならない場合は、関数を定義することなく1行のコードで何もできません。ご支援

ため

おかげで、なぜこのバージョンではありませんが、文字列のインデックスiで正しいのですか?

def vowels_count_1(s): 
    i = 0 
    counter = 0 
     while(s[i] != ""): 
     if s[i] == "a" or s[i] == "e" or s[i] == "i" or s[i] == "o" or s[i] == "u": 
      counter += 1 
     i += 1 
    print("Number of vowels: " + str(counter)) 
+0

おかげで人々、私は本当にあなたのフィードバックに感謝します。非常に支持的で、役に立つ。 –

+0

ラムダ式、関数定義、forループでのin演算子の使用は、無用な反復/コードの使用を制限しています。ありがとう、活発なスタックオーバーフロー! –

+0

チェスのように、私は文字列sの母音カウンタの候補アルゴリズムのセットのいくつかのバリエーション分析を行っています。 –

答えて

6

あなたはwhileループから抜け出すためにあなたの文字列の長さ未満であるiの条件を使用することができます。

def vowels_count(s): 
    i = 0 
    counter = 0 
    while i < len(s): 
     if s[i] in 'aeiou': 
      counter += 1 
     i += 1 
    return counter 

あなたは1行でこれをやってみたかった場合は、リストの内包の長さを使用できます:

s[i]の文字が母音で構成される文字列である場合、私はまた、単にチェックするのが容易なアプローチをお勧めします
counter = len([c for c in s if c in 'aeiou']) 
+2

'len'に' list'を送るのではなく、ジェネレータ式を 'sum '(' c in'のaeiou ')で 'sum'に送る方が効率的です。 (また、「からなる」または「含んでいる」のどちらかを使用してください)。 – TigerhawkT3

+0

より効率的ですが、私は個人的に「真== 1」を知っていて、ブール値を合計することができるので、 Pythonに新しいものを紹介するのはあまりにもあいまいです。これは、パフォーマンスよりも理解しやすいような単純な状況のようです。 – Karin

1

あなたが覚えているように、母音はsumと世代式を使って1行に数えることができます。

あなたはつまり、文字列の長さまで、あなたのループwhile i < len(s)を修正することができますが、はるかに良いだけで、我々は「文字列」と呼ぶ一連の文字を超える反復処理にあります。

for ch in s: 
    if ch == 'a' or ... 

インデックスは必要ありません。いいえi

すでにin演算子を学習している場合は、テストを簡略化できます。機能なし


はおそらく、この意味:

s = "the string" 
# your code here 
print("vowel count:", counter) 

しかし、私はわからないんだけど...

0

をここに1つのラインのソリューションです:

reduce(lambda t, c : (t + 1) if c in 'aeiou' else t, s.lower(), 0) 
関連する問題