2017-10-22 11 views
1

本質的には、入力を受け取り、それを対応する数値に変換し、「オフセット」で入力されたものをリスト内でカウントアップし、対応する新しい数値を返す必要があります。リストを集計する

たとえば、「de」の場合、「4」、「5」に変換し、「7」、「8」までカウントしてプログラムに「gh」を返す必要があります。

実際にリストを上に移動する方法を理解するのに苦労します。

import string 

translate = { 
'a': "1", 'b': "2", 'c': "3", 'd': "4", 'e': "5", 'f': "6", 
'g': "7", 'h': "8", 'i': "9", 'j': "10", 'k': "11", 'l': "12", 
'm': "13", 'n': "14", 'o': "15", 'p': "16", 'q': "17", 'r': "18", 
's': "19", 't': "20", 'u': "21", 'v': "22", 'w': "23", 'x': "24", 
'y': "25", 'z': "26", 
} 

msg = input("Enter Message: ") 
offset = input("Enter Offset: ") 
caesar = [translate[ch.lower()] for ch in msg if ch in string.ascii_letters] 
+2

正確に「リストを上に移動する」とはどういう意味ですか?また、文字列よりも整数でオフセットを追加するほうが簡単です。 – jonrsharpe

+0

私がよく分かっているのであれば、逆辞書を作ってその辞書の価値を見てください。たとえば 'd'を使用すると4が得られ、次に逆辞書で4 +オフセットが表示されます。 – prossellob

+0

誰かが "hi"と入力すると、それを対応する数字に変換する必要があります(この部分はうまくいきます)。次に、「オフセット」に入力された番号をカウントアップします。だから彼らが3に入った場合:hiは "8"、 "9"に変換され、 "11"、 "12"にする必要があります。 – white

答えて

3

手動string.ascii_lettersの代わりにインデックスが辞書を定義し、オフセットを計算することができますので、あなたはすでに、stringをインポートしています。 zからAにモジュロを使用することを忘れないでください。

import string 

msg = 'de' 
offset = 3 
caesar = ''.join(string.ascii_letters[(string.ascii_letters.index(ch) + offset) % len(string.ascii_letters)] 
       for ch in msg) 

print(caesar) 
# gh 

これは少し読みやすくなるように拡張することができます。

msg = 'de' 
offset = 3 

caesar = [] 
for ch in msg: 
    ch_index = string.ascii_letters.index(ch) 
    new_index_with_offset = (ch_index + offset) % len(string.ascii_letters) 
    new_ch = string.ascii_letters[new_index_with_offset] 
    caesar.append(new_ch) 

caesar = ''.join(caesar) 

print(caesar) 
# gh 

は、私は読者への課題として、(というよりも、Azからaにラッピングを残しておきます。

+0

よくascii_lowercaseを使用してこの部分をラップすることができますラッピングの問題を解決するために、 '(string.ascii_letters.index(ch)+ offset')を大括弧で囲みます(%は+より優先度が高い)。 – Nullman

関連する問題