を使用して、文字列 (または他の多くの Python 型) の長さを取得できますlen(s)
。したがって、これを行う 1 つの方法は、次の行を置き換えることです。
while n<=10:
これとともに:
while n<=len(str_exp) - 5:
n = 0 … while n<=bound: … n+=1
ただし、通常、Pythonのようなループは必要ありません。3 行すべてをfor n in range(bound):
. とは、 「このループを、次に、…、そして で実行する」range(5)
という意味[0, 1, 2, 3, 4]
であり、まさにその意味です。そう:for n in [0, 1, 2, 3, 4]:
n=0
n=1
n=4
n = 0 … while n<=4: … n+=1
for n in range(len(str_exp)-5):
ただし、いずれにせよ、それを台無しにして、最後のウィンドウを見逃すか、行き過ぎて通り過ぎるかのいずれかで、オフバイワンエラーが発生するのは非常に簡単です。(幸いなことに、Python では、たとえば segfault でクラッシュするのではなく、ウィンドウを 5 文字ではなく 4 文字で表示するだけでよいことを意味します)。それは必要ありません。
前向きよりも後ろ向きに考える方が簡単な場合があります。0
からへ…に行きたいことを確認するには少し考えますが、スライスを逆方向に定義すると、 からから にlen(str_exp) - 5
行くことができることは明らかです。同じことが当てはまる場合は、次のように書き換えることができます。5
len(str_exp)
for n in range(5, len(str_exp)):
window=str_exp[n-5:n]
…
または、どちらも明らかでない場合は、別の方法で定義できます。たとえば、ウィンドウの長さが 5 文字でなくなるまで進みたい場合は、次のようにします。
for n in range(len(str_exp)):
window=str_exp[n:x]
if len(window) < 5:
break
…
これを再考するさらに根本的な方法があります。例を挙げると、汎用window
関数を作成すると、ループは次のようになります。
for window in iterwindow(str_exp, 5):
…
iterwindow
おそらく、まだこの関数を書くことも読むこともできないでしょう。次のようになります。
def window(iterable, windowlength):
window = ''
for i in iter(iterable):
if len(window) == windowlength:
window = window[1:]
window = window + i
if len(window) == windowlength:
yield window
しかし、他の誰かがそれを (標準ライブラリ、または PyPI で見つけることができるモジュールで) 作成した場合は、それを使用できます。