Python:用关键字和字母表的其余部分填充5x5字符矩阵

Python:用关键字和字母表的其余部分填充5x5字符矩阵,python,encryption,matrix,character,Python,Encryption,Matrix,Character,编写Playfair密码以防有人听说 我要求用户输入一个关键字(例如:簿记),然后删除重复的字母(例如:bokeping)。我需要创建一个5x5矩阵,并用字符填充它 matrix = [][] 标记为“无效语法”。然后,我需要用唯一的字符填充矩阵,然后用字母表中的其余字母(删除唯一的关键字字符后)结束(I和j放在同一位置): 问题1:如何正确声明矩阵以用于此目的 问题2:如何在矩阵中填入关键字,然后填入其余字符 除此之外,还有什么建议吗 感谢您的帮助。Python拥有groupby:

编写Playfair密码以防有人听说

我要求用户输入一个关键字(例如:簿记),然后删除重复的字母(例如:bokeping)。我需要创建一个5x5矩阵,并用字符填充它

    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']