0

我创建了一个简单的程序,用于对用户输入的字符串执行 Caeser 密码。

为了允许移位超过列表的末尾并回到开头,我只是复制了该列表的所有列表值。

是否有一种更 Pythonic 的方式来实现此结果,以便在移位超过列表范围的末尾时它会回到开头并继续移位?

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)给你ascii值。97 是“a”的值。这ord(i) - 97与在列表中搜索 i 的索引相同。将键添加到它以进行转移。chr与之相反,ord它将 ascii 值转换回字符。

所以方法中只有一行代码。

于 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 回答