我正在使用Python编写一个加密消息的程序。我已将字符串(根据用户输入而变化)转换为列表并具有数字。我想自动更改列表中的每个字母和数字。例如,如果数字为3,则每个A
都会更改为D
。我有一个包含字母值的字典,例如{"a" : 1}, {"b" : 2},
等。
我似乎无法了解如何更改字母(不知道它们是什么)以及可能符合我的字典。
到目前为止我所拥有的(字典在其他地方):
def numtolist(n):
seedstring = str(n)
numlist = []
for digit in seedstring:
numlist.append(int(digit))
return numlist
currentnumber = seed^2
newmessage = str()
for letter in messageList:
numtolist(currentnumber)
num1 = numlist[0]
答案 0 :(得分:1)
如果变换像字母变换一样简单,您可以通过以下方式完成:
if original_character.isupper(): # Determine whether it is upper/lower case
base_a = 'A' # use 'A' as a base for uppercase
else: #
base_a = 'a' # use 'a' as a base for lowercase
orig_char_ascii = ord(original_character) # Get the original ascii value
orig_char_alpha_index = orig_char_ascii - ord(base_a) # Get the `0-25` alphabetic
# index of the character
shift_number = 3 # Set the amount to shift by
new_char_alpha_index = orig_char_alpha_index + shift_number # Add the shift value
new_char_alpha_index = new_char_alpha_index % 26 # Take the modulus to impose
# periodic boundary conditions
# i.e. if you had 'z' + 3
# 'z' + 3 -> 25 + 3 -> 28
# 28 % 26 = 2, 2 -> 'c'
new_char_ascii_index = ord(base_a) + new_char_alpha_index # scale back to the ascii
# value
new_char = chr(new_char_ascii_index)
基本思想是每个字符对应一个ascii数字,可以通过ord
获得(即ord('a') = 97
)。 chr
方法反转了这一点:chr(97) = 'a'
。
方法简要说明:你获得ascii值,缩放到0-25字母范围,添加你的移位,换出溢出字母范围的值,缩放到ascii,然后通过{{1}获得一个字符}。
你可以很多地压缩这个方法,我的教育名称很简洁:
chr
如果您想对整个字符串使用相同的随机移位,您可以将其拆分为几个方法:
def shift_char(ch,shift):
if not ch.isalpha():
return ch # return non-alphabetic characters as is
is_upper = 'A' <= original_character <= 'Z'
if is_upper:
base_a = 'A'
else:
base_a = 'a'
return chr(ord(base_a) + (ord(ch)-ord(base_a)+shift)%26)
如果您希望以后能够对其进行解码,则需要使用反转方法并存储移位值:
def shift_char(ch,shift):
if not ch.isalpha():
return ch # return non-alphabetic characters as is
if ch.isupper():
base_a = 'A'
else:
base_a = 'a'
return chr(ord(base_a) + (ord(ch)-ord(base_a)+shift)%26)
def shift_string(s,shift):
return ''.join(shift_char(i,r) for i in s)
如果您的班次是随机的,您可以将其作为参数传递:
def shift_char(ch,shift):
if not ch.isalpha():
return ch # return non-alphabetic characters as is
if ch.isupper():
base_a = 'A'
else:
base_a = 'a'
return chr(ord(base_a) + (ord(ch)-ord(base_a)+shift)%26)
def encode_string(s,shift):
return ''.join(shift_char(i,r) for i in s), shift # NOTE EXTRA return value
def decode_string(s,shift):
return ''.join(shift_char(i,-shift) for i in s)
# usage
s = 'Hello, StackOverflow!'
enc_s,shift = encode_string(s)
dec_s = decode_string(enc_s,shift)
或重新安排方法
import random
def shift_char(ch,shift):
if not ch.isalpha():
return ch # return non-alphabetic characters as is
if ch.isupper():
base_a = 'A'
else:
base_a = 'a'
return chr(ord(base_a) + (ord(ch)-ord(base_a)+shift)%26)
def encode_string(s,shift):
return ''.join(shift_char(i,shift) for i in s)
def decode_string(s,shift):
return ''.join(shift_char(i,-shift) for i in s)
# usage
s = 'Hello, StackOverflow!'
shift = random.randint(1,25)
enc_s = encode_string(s,shift)
dec_s = decode_string(enc_s,shift)