在过去结束范围内转移到列表中?

时间:2015-06-14 00:54:03

标签: python python-3.x caesar-cipher

我创建了一个简单的程序,用于对用户输入的字符串执行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)

3 个答案:

答案 0 :(得分: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的索引相同。添加键进行移位。 chrord相反,它将ascii值转换回字符。

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

答案 1 :(得分: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)

一些注意事项:您不需要将字母表转换为列表:字符串也可以迭代; dictionary可能是更好的替代数据结构。

答案 2 :(得分: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)