2017-04-17 17 views
0

クラスプロジェクト用の単純なシーザーサイファーを作成しようとしていますが、過去にサイファー鍵を作成することができません。これまでのところ私が持っている:私はこのエラーを得続けるリストの一部をPythonで文字列から整数に変換する3.4

import sys 
ALPHABET = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',''] 

def main(text, key): 
    print("Encoding message '", text,"'with key",key) 
    ALPHABET = generate_cypher(key) 

def generate_cypher(ckey): 
    cypher = [] 
    for i in ALPHABET: 
     x = ALPHABET[i] + ckey 
     cypher = cypher + x 
    return cypher 

main(sys.argv[1], int(sys.argv[2]) 

: はTypeError:リストインデックスがないALPHABETない指標で

+0

あなたのコードにはいくつかの問題がありますが、関数定義には ':'はありません。 'str' - ' x = i + ckey'を使ったインデックス作成で十分でしょう。リストに 'str'を追加しようとすると、' cypher.append(x) 'が動作します。新しい値をローカルの 'ALPHABET'にバインドします。これは意図していなかったと思います。最終的には、サイファー鍵を作成していません。 – AChampion

答えて

0

for i in ALPHABETは、要素を反復されるラインをstrが、整数でなければなりません。だから、その 'a'、 'b'、 'c'などのインデックスを反復したい場合はfor i in range(len(ALPHABET))を使います。

iは整数ではないため、ALPHABET[i]が失敗しているというエラーが表示されます。この場合、最初の反復はaという文字なのでALPHABET['a']を実行しようとしていますが、これはうまく動作せずエラーを返します。そのため、要素ではなく指数を反復処理する必要があります。インデックス長

def generate_cypher(ckey): 
    cypher = [] 
    for i in range(len(ALPHABET)): 
     x = ALPHABET[(i+ckey)%len(ALPHABET)] 
     cypher.append(x) 
    return cypher 
のための素晴らしい小さなトリックで@AChampionへ

クレジット:CKEYは、あなたは以下でコーディング修正することができますCYPHERのオフセットのための整数であることを意図していると仮定すると、

リストの利用可能なインデックスを超えてインデックスが繰り返されるように、反復の最後に状況を修正するロジックを追加しました。この時点でサイファーは先頭に折り返す必要があるため、インデックスがアルファベットのサイズより大きくならないようにするためのモジュロの必要性があります。

+1

インデックスへ行くのは、一歩前進です。ちょうど 'x = i + ckey'です。 – AChampion

+0

私はこれをして、今エラーが出ています:TypeError:リスト( "int"ではなく)をリストに連結することができます –

+0

私はそれを取り戻します、OPはおそらく 'ALPHABET [i + ckey]指数は正しい。 – AChampion

関連する問題