2017-10-02 7 views
-1

ある単語の最初の3文字をチェックしてから、同じ単語の次の文字をチェックするPythonでループを書いてみたい。文字列中のサブストリングの数をカウントする

これはこれまでのコードですが、入力後は常に1を出力します。

Count = 0 
start = 0 
end = start + 2 
word = 'dad' 
string = input('Type in a word') 

for word in string[start-end]: 
    if word in string: 
     Count = Count + 1 
    start = start + 1 

print (Count) 

誰かが私を助けてくれますか?

+0

単純な 'string.count(word)'では何が問題になりますか? –

+1

もう少し詳しく説明できますか?あなたは何を正確にチェックしていますか?あなたは入力例と期待される出力を表示できますか – CoryKramer

+0

ループの 'end'変数を更新することは決してありません。なぜなら、それは1でカウントするのを止める理由かもしれません。 – xander

答えて

0

を探しているすべてだと思います。重複しない一致の場合はこのコードは重複して動作しますが、countを使用できます。

string = 'dadada' 
substring = 'dad' 
results = 0 
sub_len = len(substring) 
for i in range(len(string)): 
    if string[i:i+sub_len] == substring: 
     results += 1 
print results 

代替

このプロセスは、事前の選択肢を持っているために、その優れたOPに合っが、将来の訪問者のためのが。 コメント欄にお勧めします。

import re 
results = sum(1 for _ in re.finditer('(?=dad)', 'dadada')) 

この機能は、使用sumforループの理由はfinditer返すイテレータとして反復の数を見つけることである解を見つけるための正規表現の正の先読みを使用します。

また、len(list(re.finditer('(?=dad)', 'dadada')))を試すと、イテレータをリストに変換してその長さを見つけることができます。

代替

非再
string = 'dadada' 
sub = 'dad' 
print len([n for n in xrange(len(string)) if string.find(sub, n) == n]) 

これはstrのカスタム方法find機能を備えた実装です。 lenを削除すると、インデックスのリストを取得できます。

+0

また、次のようなものもあります: 'results = sum(refinditer( '(?= dad)'、 'dadada')) ' –

+0

も一致しますresults = len(list(re.finditer ( '(?= dad)'、 'dadada')))) – Harry

+0

真実ですが、実際にはすべてのマッチオブジェクトのリストを作成して、長さを取る必要はありません。 –

0
word = 'dad' 
    string = input('Type in a word') 
    print (string.count(word)) 

私はそれはあなたが、私はコードを最適化しようとしてい

+0

これはオーバーラップしない一致の場合に機能します。重複するものではありません – Harry

関連する問題