def main():
cc = (input("Enter Message to Encrypt\n"))#user input
shift = int(2) #shift length
a=["a","b","c","d","e","f","g","h","i","j","k","l",
"m","n","o","p","q","r","s","t","u","v","w","x","y","z"] #reference list
newa={} #new shifted reference list
for i in range (0,len(a)):
newa [a[i]]=a[(i+shift)%len(a)]
#adds shifted 2 alaphabet into newalaphabet
#% moodulus used to wrap
for i in cc: #iterates through cc
if i in a:
a[i]=cc[i]
a[i]=newa[i]
main()
所以我需要用户输入#cc
转变需要两个
我使用了字母表
然后将字母表移动两次以创建newa
但我不知道如何将新字母应用于我的用户输入
答案 0 :(得分:0)
遍历字符串cc
并使用get
newa
方法替换所有字母表。不在字典中的字符保留原样,当缺少密钥时将它们作为默认值传递给newa.get
:
newa = {}
for i, x in enumerate(a):
newa[x] = a[(i+shift) % len(a)]
encrypted_text = ''.join(newa.get(i, i) for i in cc)
在这种情况下,可以使用Python的内置enumerate
代替range(len(a))
,您需要a
中的项目及其各自的索引。
答案 1 :(得分:0)
对每个字符使用映射,然后将它们连接起来以创建加密消息:
''.join(map(lambda x: chr((ord(x) - 97 + shift) % 26 + 97) if x in alphabet else x, cc.lower()))
像这样整合:
import string
alphabet = string.ascii_lowercase
cc = input('Enter string to encode: ')
shift = 2 # could be any number
encrypted = ''.join(map(lambda x: chr((ord(x) - 97 + shift) % 26 + 97) if x in alphabet else x, cc.lower()))
cc.lower()
表示字母完全相同(使用常量ord
进行映射)
chr((ord(x) - 97 + shift) % 26 + 97)
:
a
为0,b
为1等)。a
转到c
等)。z
之类的字母超出(25 + 2 = 27,27%26 = 1 = b
)。a
为97,b
为98等)。 if x in alphabet else x
覆盖非字母的标记(如果您想忽略空格和标点符号而使用if x in alphabet else ''
)。
答案 2 :(得分:0)
使用字典将输入映射到输出
shifted_a = a[-shift:] + a[:-shift]
cipher = {a[i]: shifted_a[i] for i in range(len(a))}
output = ''.join(cipher[char] for char in cc)
答案 3 :(得分:0)
我只是构建转换表并用它来解码字符串。
import string
shift = 2
letters = string.ascii_lowercase + string.ascii_uppercase
transtable = str.maketrans({letters[i]: letters[(i + shift) % len(letters)]
for i in range(len(letters))})
cc = input('Enter string to encode: ')
print(cc.translate(transtable))
答案 4 :(得分:0)
我会把我的解决方案扔进那里。应该很清楚它是如何工作的......
import string
index_lookup = {letter: index for index, letter in enumerate(string.ascii_lowercase)}
def caesar_letter(l, shift=2):
new_index = index_lookup[l] + shift
return string.ascii_lowercase[new_index % len(index_lookup)]
def caesar_word(s):
return ''.join([caesar_letter(letter) for letter in s])
我认为上述内容对可读性更好,但如果您反对进口......
index_lookup = {chr(idx): idx - ord('a') for idx in range(ord('a'), ord('z')+1)}
...
In [5]: caesar_word('abcdefghijklmnopqrstuvwxyz')
Out[5]: 'cdefghijklmnopqrstuvwxyzab'