2017-07-19 14 views
0

私はPythonで暗号化ツールを作っていますが、その処理の一部は、各位置を暗号化された位置に再割り当てすることです。コードは、これは、このコードによって実現され、各文字で暗号化を実行するためのものです:forループが十分にループしていない - Python

for pos in range (0, len(plaintext)-1): 
    print("pos is %s" % (pos)) 

次のコードは無関係でなければなりませんが、供給することができます。 このコードが実行されると、出力され、Iは「-1」の部分を削除した場合、ループは決して3である「平文」の長さにもかかわらず、2に到達しない

は(長さとして含ま

pos is 0 
pos is 1 

と最終位置が同じではない)、次のコードが範囲外であるというエラーが発生しました(私の目の次のコードは変更する必要はありませんが、提供することができます)。

誰でも問題を理解したり説明したりできますか?

パイソン2.7.11 のWindows 8.1

EDIT:

コードループの開始後、以下の通りである、

for pos in range (0, len(plaintext)-1): 
    print("pos is %s" % (pos)) 
    for k in range (0, key): 
     if(plaintext[pos] == "z"): 
      crypt = "%s%s%s" % (crypt[:pos], "a", crypt[pos+1:]) 
     else: 
      crypt = "%s%s%s" % (crypt[:pos], abc[abc.index(plaintext[pos])+1], crypt[pos+1:]) 

誤差[によるスライスが 陰窩さまで上昇させましたpos + 1:]

2.7.11の位置に割り当てることができないため、私の回避策は連結することでした新しく暗号化された鍵の周りの私の位置の「側」かどちらかです。

+1

あなたがこの助けを望むならば、私たちは 'plaintext'を表示します。 – jacoblaw

+7

' range() 'は' stop'値を含まないので、 'range(len(plaintext))'で十分です。注: 'for pos、列挙型の文字列(平文):'おそらく良いでしょう。 – AChampion

+0

'range(len(plaintext))' –

答えて

0

range(lower, upper)は、lowerで始まり、upper-1で終了する値を含むリストを返します。 len(plaintext) == 3の場合、リストには01という要素が正しく含まれています。

あなたのエラーについては、関連するコードを含めていません。

+1

答えが分かるかどうか分かりません。 –

0

は、[0, 1, 2]というように、range(len(plaintext))(デフォルト値はゼロに設定されています)のようになります。

しかし、文字列内のすべての文字を調べるためのPythonの方法(あなたの実際の目標を前提として)はfor c in plaintextとなります。 range(0,2)はいつもになりますよう設定範囲2に等しく、その後

for i, c in enumerate(plaintext): 
    print('pos is %s" % (i)) 
0

plaintextの長さが3である場合は、len(plaintext)-1を行います。また、列挙子(文字とインデックスの両方を取得)してご使用0と1のみ。、出力のみ[0,1]

つまり、rangeへの第2引数は、トップの限界であるが、はない自体が今

を含んでます

print(list(range(0, len(plaintext)-1))) 

:あなたはこのラインを使用していることをテストすることができますあなたの2番目の部分のために - あなたが2に到達すると、残りのコードのどこかに、それに2つの項目しかないので、2のインデックスを与えると、3番目の項目を検索しているように見えます0でインデックスを開始します)、エラーが発生します。 escribe(範囲外のインデックス)。なぜあなたのコードが見えないのか正確にはわかりません。

0

他の人が言ったように、範囲の端部は排他的であり、ループの正しいであることを意味する:あなたのコードの第2部分において

for pos in range(len(plaintext)): 

plaintextcryptが同じ長さであると仮定すると、 crypt[pos+1:]は最後のループでエラーを返します。たとえば、plaintextの長さが3の場合、posは最後のループでは2であり、crypt[3]は文字列の末尾を超えてインデックス付けされます。 pos < len(crypt)場合crypt[pos+1:]にのみ実行されるように

end = crypt[pos+1:] if pos < len(crypt) else "" 
crypt = "%s%s%s" % (crypt[:pos], abc[abc.index(plaintext[pos])+1], end) 

これは、それを作る:この問題を解決するために、あなたは三項演算子を使用することができます。

関連する問題