Python:用关键字和字母表的其余部分填充5x5字符矩阵
编写Playfair密码以防有人听说 我要求用户输入一个关键字(例如:簿记),然后删除重复的字母(例如:bokeping)。我需要创建一个5x5矩阵,并用字符填充它Python:用关键字和字母表的其余部分填充5x5字符矩阵,python,encryption,matrix,character,Python,Encryption,Matrix,Character,编写Playfair密码以防有人听说 我要求用户输入一个关键字(例如:簿记),然后删除重复的字母(例如:bokeping)。我需要创建一个5x5矩阵,并用字符填充它 matrix = [][] 标记为“无效语法”。然后,我需要用唯一的字符填充矩阵,然后用字母表中的其余字母(删除唯一的关键字字符后)结束(I和j放在同一位置): 问题1:如何正确声明矩阵以用于此目的 问题2:如何在矩阵中填入关键字,然后填入其余字符 除此之外,还有什么建议吗 感谢您的帮助。Python拥有groupby:
matrix = [][]
标记为“无效语法”。然后,我需要用唯一的字符填充矩阵,然后用字母表中的其余字母(删除唯一的关键字字符后)结束(I和j放在同一位置):
问题1:如何正确声明矩阵以用于此目的
问题2:如何在矩阵中填入关键字,然后填入其余字符
除此之外,还有什么建议吗
感谢您的帮助。Python拥有
groupby
:
>>> from itertools import groupby
>>> s = 'aabbccc'
>>> [k for k, g in groupby(s)]
['a', 'b', 'c']
问题1:如何正确声明矩阵以用于此目的
矩阵是列表的列表。您可以这样声明:
m=[[x,y]表示范围(3)中的x,表示范围(3)中的y]
您可以创建具有嵌套列表结构的矩阵
[row[1] for row in M] # Column 2
[2, 5, 8]
例如,下面的代码定义了一个3x3矩阵
M = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
M[1] # Row 2
[4, 5, 6]
M[1][2] # Row 2, item 3
6
您可以使用列表理解来处理结构
[row[1] for row in M] # Column 2
[2, 5, 8]
出于练习的目的,你应该将通行短语和明文中的所有
j
字符替换为i
,这样你就不必担心双字符了
然后,要构建矩阵,您可以执行以下操作:
from itertools import chain
key = "bookkeeping".replace("j", "i")
alphabet = "abcdefghiklmnopqrstuvwxyz" # note no J
# dedup the list of characters
slots = []
for x in chain(key, alphabet):
if not x in slots: slots.append(x)
# get our matrix using list slices
matrix = [ slots[i:i+5] for i in xrange(0, 25, 5) ]
print matrix
结果:
[['b', 'o', 'k', 'e', 'p'], ['i', 'n', 'g', 'a', 'c'], ['d', 'f', 'h', 'l', 'm'], ['q', 'r', 's', 't', 'u'], ['v', 'w', 'x', 'y', 'z']]
以前从未见过playfair——这是一个很好的算法挑战 如果你像我一样偏执于图书馆,那么这就是你的解决方案
def raw_inp(msg):
#This function makes sure the raw_input function is available in
#both python 2.x or 3.x
try:
return raw_input(msg)
except NameError:
return input(msg)
def unique_array(arr):
#This function removes duplicates of array values
check = []
for i in arr:
if i not in check:
check.append(i)
return check
def form(key):
key = key.lower() #make sure key is all lowercase
alpha = []
key_arr = [] #Convert key to array
key_arr.extend(key)#Convert key to array
key = key_arr #Convert key to array
alpha.extend("abcdefghijklmnopqrstuvwxyz") #Convert alphabet to array
arr = (key+alpha)
new_arr = []
finish_arr = []
return_arr = []
arr = unique_array(arr) #Removes any duplicate letters before we start
for i in arr:
if i in alpha: #if the character is in the alphabet
if i == "i" or i == "j": #if it is i or j, place it together
new_arr.append("ij")
else:
new_arr.append(i) #or else place the letter in the array
x = 0 #array index
i = 0
new_arr = unique_array(new_arr)
while x < 5:
finish_arr.append([])
finish_arr[x] = []
y = 0
while y < 5:
finish_arr[x].append(new_arr[i])
y += 1
i += 1
x += 1
for i in finish_arr:
return_arr.append(unique_array(i))
return return_arr
key = raw_inp("Key: ") #get key
arr = (form(key)) #
for i in arr:
print i
def raw_inp(msg):
#此函数确保原始输入函数在中可用
#Python2.x或3.x
尝试:
返回原始输入(msg)
除名称错误外:
返回输入(msg)
def唯一_阵列(arr):
#此函数用于删除数组值的重复项
检查=[]
对于arr中的i:
如果我没有登记:
勾选.追加(一)
退票
def表格(密钥):
key=key.lower()#确保key都是小写的
alpha=[]
密钥_arr=[]#将密钥转换为数组
键_arr.extend(键)#将键转换为数组
key=key_arr#将key转换为数组
alpha.extend(“abcdefghijklmnopqrstuvxyz”)#将字母表转换为数组
arr=(键+字母)
新的_arr=[]
完成\u arr=[]
返回\u arr=[]
arr=唯一数组(arr)#在开始之前删除所有重复的字母
对于arr中的i:
如果字母中有i:#如果字符在字母表中
如果i==“i”或i==“j”:#如果是i或j,将其放在一起
新附件(“ij”)
其他:
新建_arr.append(i)#或将字母放入数组中
x=0#数组索引
i=0
new_arr=唯一_数组(new_arr)
当x<5时:
完成\u arr.append([])
完成\u arr[x]=[]
y=0
y<5时:
完成\u arr[x]。追加(新\u arr[i])
y+=1
i+=1
x+=1
对于i in finish_arr:
返回数组附加(唯一数组(i))
返回
key=raw_inp(“key:)#get key
arr=(表(键))#
对于arr中的i:
打印i
很抱歉我的风格很奇怪。我用另一种方式编程,然后换成这种方式
这段代码应该是可以理解的,而不是简短或高效的。如果您不了解某些内容,请发表评论。其他字符的顺序是否重要?是否有办法创建一个空矩阵,以便在之后用字符填充?
groupby
仅处理连续重复的groupby(“aabbccca”)>>>['a','b','c','a']