列表

时间:2015-05-20 01:47:31

标签: python list matrix-multiplication

这是对Hill Cipher的尝试,到目前为止一直很好,直到第二和第三三元组相乘。我真的不明白我的错误在哪里。 基本上我要做的是列表乘法。

使用此代码我创建了一个列表

key=[k[x:x+3] for x in xrange(0, len(k), 3)]
message=[m[x:x+1] for x in xrange(0, len(m), 1)]    
key=[[16, 4, 11], [8, 6, 18], [15, 19, 15]]
message=[[0], [12], [8], [6], [15], [2], [15], [13], [3], [21], [2], [20], [15], [18], [8]]

我的目标是将key list中的每个子列表或列乘以message list

中的前三个列表

更新: 我已按照建议制作了一个嵌套循环,并且我已将消息列表分成块但仍然无法使其工作。

嵌套循环

result = [[0,],
         [0,],
         [0],]
#Divide the matrizm into chunks
n = 3
chunks = (matrizm[x:x+n] for x in range(0,len(matrizm), n))

#Matrix multiplication 
for triagram in chunks:
  # iterate through rows of X
  for i in range(len(matrizk)):
    # iterate through columns of Y
    for j in range(len(triagram[1])):
        # iterate through rows of Y
        for k in range(len(matrizk)):
           result[i][j] += matrizk[i][k] * triagram[k][j]

使用我当前的代码,我可以将前3个三角形乘以,这样就可以得到错误的结果。

我的问题是,有了这两个列表,我怎样才能将前3个三角形然后再增加3个,依此类推,直到matrizk列表结束

matrizk = [[16, 4, 11], [8, 6, 18], [15, 19, 15]]
matrizk = [[0], [12], [8], [6], [15], [2], [15], [13], [3], [21], [2], [20], [15], [18], [3]]

1 个答案:

答案 0 :(得分:0)

答案假设Python 2.7x

数据:

key=[[16, 4, 11], [8, 6, 18], [15, 19, 15]]
message=[[0], [12], [8], [6], [15], [2], [15], [13], [3], [21], [2], [20], [15], [18], [8]]

似乎使事情复杂化的一件事是message是一个列表列表,为了使事情变得更容易,它需要在某些时候被夷为平地。

我将使用itertools recipe来获取消息的块,因为我将使用生成器来展平消息。还有其他方法可以将答案中的列表展平:How do you split a list into evenly sized chunks in Python?

import itertools
def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return itertools.izip_longest(fillvalue=fillvalue, *args)
# flatten the message [[1],[2]] -> [1,2]
message = (item for thing in message for item in thing)

zip是另一个有用的功能,它类似于换位:

>>> zip([1,2],[3,4])
[(1, 3), (2, 4)]
>>> 

现在我们将使用键和每个3项,消息块进行矩阵乘法。

for group in grouper(message, n):
    # matrix multiplication
    for row in key:
        sum_prod = 0
        for a, b in zip(group, row):
            sum_prod += a*b
        #print(group, row, sum_prod, sum_prod % 26)
        result.append(sum_prod)
        #result.append(sum_prod % 26)