2011-01-16 3 views
1

質問は、文字が文字列に何回出現するかを一般化可能な方法で測定する方法ですPython。演習7.9「コンピュータ科学者のように考える方法(python)」文字列内の文字の出現を測定する

私が書いたコード:

def countLetters(str, ch): 
    count=0 
    index=0 
    for ch in str: 
    if ch==str[index]: 
     count=count+1 
    index=index+1 
    print count 

私はこの機能を使用する場合、それは代わりに文字が文字列で発生した回数の文字列の長さを測定します。私は何を間違えたのですか?このコードを書く正しい方法は何ですか?

答えて

5

あなたは上で書き、あなたの「CH」変数です:

def countLetters(str, ch): 
#     ^the character you are looking for 
    count=0 
    index=0 
    for ch in str: 
#  ^the string character you are trying to check 
     if ch==str[index]: # ??? 
      count=count+1 
     index=index+1 
    print count 

(また、ちょうどそれを印刷するよりも、値を返すために、通常より有用です)。

組み込みの方法はstr.countです:

あなたのコードを書き換える可能性がどのように
"aaabb".count("a") -> 3 

def countLetters(search_in, search_for): 
    count = 0 
    for s in search_in: # iterate by string char, not by index 
     if s==search_for: 
      count += 1 
    return count 

と迅速な神託の交換:

def countLetters(search_in, search_for): 
    return sum(1 for s in search_in if s==search_for) 
0

ループが間違っています。

for s in str: 
    if ch == s: 
     ... 

このようindex変数が使用されることはありません、あなたはそれを削除することができます

これは動作するはずです。

完全
def countLetters(str, ch): 
    count = 0 
    for s in str: 
    if ch == s: 
     count += 1 
    print count 
0

:だから、完成したコードは次のようになります

cnt += 1 

:あなたはまた、のような+=オペレータによって変数をインクリメントすることができます

for index in range(len(str)): 
    ... (rest is OK but ...) 
    ... (do not increase index in loop body) 

:あなたはindexを使用したい場合は、その後にforを変更テストされていない:

def count_letters(s, c): 
    return sum(1 for x in s if x == c) 
+0

ドロップリストの内包。ちょうどジェネレータ表現を使用してください。 – delnan

+0

修正しました、ありがとうございます。 –

2

は、論理的に考えますあなたのコードを実行するときに何が起こるかについて:ループ内のテストが最初の反復で成功するので、保証されます毎回成功する! Pythonの反復処理が動作しているかどうかを確認するだけです。

正しい処方は

def count(s, input): 
    count = 0 
    for c in s: 
     if c == input: 
      count += 1 

であるか、同等に、

def count(input): 
    return sum(c == input for c in s) 

しかし、あなたはちょうど同様に行うことができます:

s.count(c) 
+0

'count'の引数に' s'を追加するのを忘れませんでしたか? – Bolo

+0

うん、固定、ありがとう! – katrielalex