Python |用字典加密字符串



所以我已经设置了加密字典:

alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ "
encrypt = "CDEFGHIJKLMNOPQRSTUVWXYZAB "
word = input("Enter the message: ")
d = {alphabet[i]: encrypt[i] for i in range(len(alphabet))}

假设我想加密word,我在这里用replace(),但如果我用那个,它只是用AB代替了所有的东西。

我的代码现在看起来像这样:

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等,您只有ba,因为这是代码中的最后两个字母,代码中的间隙是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()))

最新更新