我创建了一个简单的程序,用于对用户输入的字符串执行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)
答案 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的索引相同。添加键进行移位。 chr
与ord
相反,它将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)