3

生の入力から文字列を読み取り、文字列に含まれる母音の数を数えることを求める宿題の質問があります。これは私がこれまでに持っているものですが、問題が発生しました:

def vowels():
    vowels = ["a","e","i","o","u"]
    count = 0
    string = raw_input ("Enter a string: ")
    for i in range(0, len(string)):
        if string[i] == vowels[i]:
            count = count+1
    print count

vowels()

母音は問題なく数えますが、範囲が増えていくため、if string[i] == vowels[i]:1 つの母音しか数えません。iこのコードを変更して、この問題に遭遇せずに入力文字列の母音をチェックするにはどうすればよいですか?

4

6 に答える 6

9

inオペレーター

in演算子の代わりに演算子==を使用することをお勧めします。in演算子を使用すると、特定のアイテムがシーケンス/セットに含まれているかどうかを確認できます。

1 in [1,2,3] # True
1 in [2,3,4] # False
'a' in ['a','e','i','o','u'] # True
'a' in 'aeiou' # Also True

その他のコメント:

セット

この演算子は、「アイテム X はこのアイテム セットの一部である」種類の操作を迅速に実行できるように特別に設計されたデータ型であるinとともに使用すると最も効率的です。set

vowels = set(['a','e','i','o','u'])

*は、dict にキーが存在するかどうかを確認する をdict使用しても効率的です。in

文字列の反復

文字列は Python のシーケンス型です。つまり、長さを取得してからインデックスを使用するというすべての作業を行う必要はありません。文字列を反復処理するだけで、各文字を順番に取得できます。

例えば:

for character in my_string:
    if character in vowels:
        # ...

文字列でセットを初期化する

上記で、(少なくとも Python 2.x では) 事前設定された値でセットを作成するには、リストを使用する必要があることに気付いたかもしれません。これは、set()型コンストラクターが一連の項目を取るためです。また、前のセクションで、文字列は Python のシーケンス、つまり文字のシーケンスであると述べたことに気付くかもしれません。

これが意味することは、一連の文字が必要な場合、実際にはそれらの文字の文字列をset()コンストラクターに渡すだけでよいということです。単一文字の文字列をリストする必要はありません。つまり、次の 2 行は同等です。

set_from_string = set('aeiou')
set_from_list = set(['a','e','i','o','u'])

いいですね。:) ただし、文字のセットではなく文字のセットを作成しようとしている場合、これはあなたを噛む可能性があることに注意してください。たとえば、次の 2 行は同じではありません。

set_with_one_string = set(['cat'])
set_with_three_characters = set('cat')

前者は 1 つの要素を持つセットです。

'cat' in set_with_one_string # True
'c' in set_with_one_string # False

一方、後者は 3 つの要素 (それぞれが文字) のセットです。

'c' in set_with_three_characters` # True
'cat' in set_with_three_characters # False

大文字と小文字の区別

文字の比較では、大文字と小文字が区別されます。'a' == 'A'は False です'A' in 'aeiou'。これを回避するには、入力を変換して、比較対象の大文字と小文字を一致させることができます。

lowercase_string = input_string.lower()
于 2012-10-04T02:44:06.330 に答える
5

このコードを簡略化できます。

def vowels():
    vowels = 'aeiou'
    count = 0
    string = raw_input ("Enter a string: ")
    for i in string:
        if i in vowels:
            count += 1
    print count

文字列は Python で反復可能です。

于 2012-10-04T02:42:48.237 に答える
2
for i in range(0, len(string)):
    if string[i] == vowels[i]:

これには実際には、各母音を 1 回だけカウントするよりも微妙な問題があります。実際には、文字列の最初の文字が正確aに であるかどうか、2 番目の文字が正確であるかどうかなどをテストするだけでe、5 番目を超えるまで続きます。テストを試みstring[5] == vowels[5]ますが、エラーが発生します。

iを調べるために使用したくないvowels場合は、意味のある2番目のインデックスを持つネストされたループが必要ですvowels-たとえば、

for i in range(len(string)):
   for j in range(len(vowels)):
       if string[i] == vowels[j]:
          count += 1

これは、Python では、インデックスをシーケンスに繰り返したいと思うことはめったにないことを理解することで、さらに単純化できます。ループは、for実行できるすべてのことを繰り返し処理する方法を知っています。string[0]string[1]

for s in string:
   for v in vowels:
      if s == v:
        count += 1

内側のループは、リストに対する操作を使用して単純化できます。inこれは、このコードとまったく同じことを行いますが、コードのロジックをより高いレベルに保ちます (やりたいこととその方法):

for s in string:
   if s in vowels:
       count += 1

さて、Pythonはブール値(これがs in vowelsあなたに与えるものです)とintをTrue使っ1て数学Falseを行う0ことTrue + True + Falseができます2. これは、ジェネレーター式と合計を使用するワンライナーにつながります。

sum(s in vowels for s in string)

stringこれは、「のすべての文字について、何文字あるかを数えます」と読みますvowels

于 2012-10-04T02:56:38.840 に答える
1

ワンライナーにフィルターを使用できます

print len(filter(lambda ch:ch.lower() in "aeiou","This is a String"))
于 2012-10-04T02:49:33.873 に答える
0

sumジェネレーターを使用した、より凝縮されたバージョンを次に示します。

def vowels():
    string = raw_input("Enter a string: ")
    print sum(1 for x in string if x.lower() in 'aeiou')

vowels()
于 2012-10-04T02:53:04.930 に答える