所以我已经设置了加密字典:
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ "
encrypt = "CDEFGHIJKLMNOPQRSTUVWXYZAB "
word = input("Enter the message: ")
d = {alphabet[i]: encrypt[i] for i in range(len(alphabet))}
假设我想加密word
,我在这里用replace()
,但如果我用那个,它只是用A
和B
代替了所有的东西。
我的代码现在看起来像这样:
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ "
encrypt = "CDEFGHIJKLMNOPQRSTUVWXYZAB "
d = {alphabet[i]: encrypt[i] for i in range(len(alphabet))}
word = input("Enter a word: ")
for key in d.keys():
word = word.upper().replace(key, d[key])
print(word)
,在终端中打印出&;baab &;。不知道为什么它只使用A和B,而没有其他。
您可以使用.join()
:
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ "
encrypt = "CDEFGHIJKLMNOPQ9RSTUVWXYZAB "
d = {a: e for a, e in zip(alphabet, encrypt)}
''.join(d[i] for i in 'word'.upper())
输出:
'XQSF'
您正在逐个替换字母,因此字母a
更改为c
,但在下一个循环中,c
将更改为e
等,您只有b
和a
,因为这是代码中的最后两个字母,代码中的间隙是2。
必须使用另一个变量并遍历初始变量并将第一个变量
中的键的值字母添加到另一个变量中不确定是否真的清楚,所以这里有一个例子:
word2 = ""
for i in word:
word2 += d[i]
首先你把A换成C,这样你就没有A了(只有B到Z),然后你把B换成D,这样你就没有B了(只有C到Z),等等。快结束时,你只剩下y和z了,你分别用A和B代替它们。这就是为什么你的输出只有a和b。
你应该让所有的替换"平行"。而不是像你做的顺序,一个正确的方法是使用str.translate
:
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ "
encrypt = "CDEFGHIJKLMNOPQRSTUVWXYZAB "
trans = str.maketrans(alphabet, encrypt)
word = 'Chaos'
print(word.upper().translate(trans))
输出:
EJCQU
像这样做应该可以解决这个问题:
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ "
encrypt = "CDEFGHIJKLMNOPQRSTUVWXYZAB "
d = {alphabet[i]: encrypt[i] for i in range(len(alphabet))}
print(''.join([d[i.upper()] for i in input("Enter a word: ")]))
添加@Nin17的答案并假设字典d
是给定的,您可以使用map
而不是列表推导来获得字符串:
res = "".join(map(d.get, "word".upper()))
正如NicoCaldo所指出的,您也可以简单地将2
添加到每个字符的ASCII数字表示中,将空格字符括起来并例外。
from_letter = ord("A")
to_letter = ord("Z")
range = to_letter - from_letter
offset = ord("B") - from_letter
res = "".join(map(lambda c: c if c == " " else chr(from_letter + ((ord(c)-from_letter+offset) % range)), "some words".upper()))