0

I created a simple program for performing a Caeser cipher on a user inputted string.

In order to allow the shift to go past the end of the list and back to the beginning, I simply duplicated all the list values for that list.

Is there a more pythonic way of achieving this result so that it will shift back to the beginning and continue to shift if the shift goes past the end of the list range?

while True:
    x = input("Enter the message you would like to encrypt via a Caeser shift; or type 'exit': ")
    if x == 'exit': break
    y = int(input("Enter the number by which you would like to have the message Caeser shifted: "))
    alphabet = list('abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz')
    encoded = ''
    for c in x:
        if c.lower() in alphabet:
            encoded += alphabet[alphabet.index(c)+y] if c.islower() else alphabet[alphabet.index(c.lower())+y].upper()
        else:
            encoded += c
    print(encoded)
4

3 に答える 3

2

これが私が書くことができる最高のPythonicの方法です。各文字には定義済みの範囲を持つ ASCII 値があるため、リストは必要ありません。遊んでみてください。

def encrypt(text,key):
    return "".join( [  chr((ord(i) - 97 + key) % 26 + 97)  if (ord(i) <= 123 and ord(i) >= 97) else i for i in text] )

ord(i)アスキー値を提供します。97 は「a」の値です。リストord(i) - 97で i のインデックスを検索するのと同じです。それにキーを追加してシフトします。chrの反対でordあり、ASCII 値を文字に変換します。

したがって、メソッド内のコードは 1 行だけです。

于 2015-06-14T01:11:13.513 に答える
1

このようにしたい場合は、モジュラー演算を使用して のインデックスを計算するのが最善の策ですalphabet

while True:
    x = input("Enter the message you would like to encrypt via a Caeser shift; or type 'exit': ")
    if x == 'exit': break
    y = int(input("Enter the number by which you would like to have the message Caeser shifted: "))
    alphabet = 'abcdefghijklmnopqrstuvwxyz'
    encoded = ''
    for c in x:
        if c.lower() in alphabet:
            i = (alphabet.index(c.lower()) + y) % 26
            encoded += alphabet[i] if c.islower() else alphabet[i].upper()
        else:
            encoded += c
    print(encoded)

いくつかの注意: アルファベットをリストに変換する必要はありません: 文字列も反復可能です。辞書は、より優れた代替データ構造である可能性があります。

于 2015-06-14T01:03:53.507 に答える
1
x = "message"
y = 10 # Caeser shift key
alphabet = list('abcdefghijklmnopqrstuvwxyz')
encoder = dict(zip(alphabet, alphabet[y:]+alphabet[:y])) 
encoded = "".join(encoder[c] for c in x)
于 2015-06-14T01:04:32.637 に答える