2017-05-20 18 views
1

私はPythonの割り当てに取り組んでいます。文字列中の部分文字列の数を数えよう

明らかに、文字列内の指定された部分文字列の数を数えるコードを書く必要があります。

私はそれが正しいと思った、そして、私はここで立ち往生した。私はこれを実行する場合

def count(substr,theStr): 
    # your code here 
    num = 0 
    i = 0 
    while substr in theStr[i:]: 
     i = i + theStr.find(substr)+1 
     num = num + 1 

    return num 

substr = 'is' 
theStr = 'mississipi' 
print(count(substr,theStr)) 

が、私は結果としてを得ることを期待、むしろ、私が手 ...

を参照してください、このようanabananaなどの他の例は、正常に動作しますが、この具体的な例ではエラーが発生しています。私はここで何が悪いのか分からない。

私を助けてくれませんか?あなたが必要なコードの変更がある

答えて

0
あなたのコードで

while substr in theStr[i:]: 

正しくしかし

i = i + theStr.find(substr)+1 

theStrの先頭から見続け、ターゲット文字列theStr上で進めます。

str.find(sub[, start[, end]])

戻りサブサブが内 見出される文字列内の最小インデックス:

str.find方法は、検索を制限するために、オプションの開始引数を受け付けスライスs[start:end]。オプションの引数startend はスライス表記と解釈されます。サブが見つからない場合は-1を返します。

ここでinを使用する必要はありません。findが-1を返さないことを確認できます。部分文字列のインデックスを取得するには、findを使用して検索を繰り返す必要があるときに、in検索を実行するのは少し無駄です。

str.countメソッドはオーバーラップしないマッチを見つけることができ、Cで実装されているので、Pythonで自分で実装するよりも効率的です。

def count(substr, theStr): 
    num = i = 0 
    while True: 
     j = theStr.find(substr, i) 
     if j == -1: 
      break 
     num += 1 
     i = j + 1 
    return num 

print(count('is', 'mississipi')) 
print(count('ana', 'bananana')) 

出力このコードのコアは、

j = theStr.find(substr, i) 

i

が0に初期化されるので、私たちはtheStrの先頭から検索を開始し、理由のi = j + 1ある

2 
3 

その後の検索は、最後に見つかったマッチに続くインデックスから検索を開始します。

0

- ストリングが常にiまで発見された代わりに、あなたのコードで

i = i + theStr.find(substr)+ 1 

i = i + theStr[i:].find(substr)+ 1 

は、4位以上に達します。しかし、サブストリングのインデックスを見つけることながら、あなたは最初の繰り返しiは、次の反復str[i:]で、だから、2になった後に今度は、bananaのあなたの例では1

としての位置を返し、元の(全体の)文字列を使用していましたnanaになります。このスライスされた文字列内の部分文字列anaの位置と元の文字列は1です。したがって、コード内のバグは単に抑制され、コードは正常に動作しているようです。

あなたのコードが純粋に学習目的のものであれば、このようにすることができます。それ以外の場合は、pythonが提供する関数(例えば、count())を使用してジョブを実行することができます。

0
def count(substr,theStr): 
    num = 0 
    for i in range(len(theStr)): 
     if theStr[i:i+len(substr)] == substr: 
      num += 1 
    return num 

substr = 'is' 
theStr = 'mississipi' 
print(count(substr,theStr)) 
+3

**レビューキューから:**あなたの答えの周りにいくつかの文脈を追加してください。コードのみの回答は理解しにくいです。あなたの投稿にさらに情報を追加することができれば、これはAskerと将来の読者に役立ちます。 –

関連する問題