2016-09-09 21 views
0
s = "abobabobabob" 
total = 0 

for i in range(len(s)): 
    if s[i-1 : i+2] == 'bob': 
     total += 1 

print ('times bob occurs is:' + str(total)) 

ifステートメントを変更する簡単な方法はありますか?また、誰かが私にi-1 : i+2は何を教えてくれますか?文字列内の一致する部分文字列を数える

「bob」の出現を見つけるためにこのコードを書いていますが、しばらく詰まっています。

+0

あなたの質問にはさらに便利なタイトルをください。 – Barmar

+0

あなたのインデントが乱れています。 Pythonではインデントを取得することが重要です。 – Barmar

+0

'[i-1:i + 2]'の意味については、http://pythoncentral.io/cutting-and-slicing-strings-in-python/を参照してください。これは文字列スライスです。 – Barmar

答えて

1

次のコードは、各'bob'サブストリングの開始インデックスを検索し、その値を配列に追加します。 total変数は、その配列内の値の数を返します。

total = 0 
s = "abobabobabob" 

total = len([i for i in range(len(s)) if s.find('bob', i) == i]) 

print('times bob occurs is: ' + str(total)) 

プリント:ワンライナーとして

あなたforループへの変更をしたい場合

times bob occurs is: 3 

---ここでは、代替です:

total = 0 
s = "abobabobabob" 

for i in range(len(s)): 
    if (s.find('bob', i) == i): 
     total += 1 

print('times bob occurs is: ' + str(total)) 

プリント:

times bob occurs is: 3 
+0

ニースワンライナー+1。しかし、彼はforループを使用していて、インデントの問題があったので、定期的なfor-loopを使用してこれを行う方法を彼に示してもよいでしょうか? –

+0

forループ修正をソリューションに追加しました。 – ode2k

1

の場合[I-1:iは+ 2] == 'ボブ' は、現在のインデックス-1現在のインデックス+ 2が 'ボブ' であるか否かをチェックします。

s = "abobabobabob" 
total = 0 

for i in range(1,len(s)): 
    if s[i-1 : i+2] == 'bob': 
     total += 1 

2行

s= "abobabobabob" 
print sum( s[i:i+3] =='bob' for i in range(len(s)-2)) 

3 
+0

私はOPのコードを試しましたが、(適切な字下げを加えた後に)エラーを引き起こしませんでした。私はかなり驚きました。 –

+0

@ChadDavisそうすべきではありません。 Pythonのインデックスでは負の値になります。 s [-1:2]は空文字列 – galaxyan

+0

で最初にIPythonでテストし、スクリプトをファイルに入れて実行しました。 Python 3を使用する。これは調べる価値があります。 –

2

あなたのより良い方法がある:それは、私は0から始まり、I-1がリスト
の最後の要素である

試しているので、問題が発生しますif文がsのサブセットを参照しています。ソートのあなたの他の質問に答えるために、ここではより多くのif文よりを変更する簡単な方法があります:

これはPythonの正規表現ライブラリである

import re 

のすべて、重複しないインスタンスの組み込みのステートメントを検索'bob'を返し、各マッチが要素としてリストを返します。外側のステートメントは、ちょうど右の場合は文字+ 2つの文字(インデックスiで)文字列sに文字ごとenumerate()

s = "abobabobabob" 
n = len([i for i, w in enumerate(s) if s[i:i+3] == "bob"]) 

print ('times bob occurs is:', n) 

このチェックを使用して、リスト

len(re.findall('bob',s)) 
1

内の要素の数をカウント「ボブ」に等しい。あなたの例では

:あなたのsecundary質問について


s[i-1 : i+2]ながら

s[i-1 : i+2] 

は、s[0]が最初の文字である文字列内の文字のインデックス(i)を指し、文字列sスライス、現在の文字-1(左側の文字)から現在の文字+2(右側の2番目の文字)。

+0

_Using enumeraste()_ _enumerate_を意味しますか? –

+0

@ Mr.goosberry 'aste' ate' ate' :)ありがとうございました! –