是否有可能从for循环中获取值到列表中?

时间:2018-01-19 08:34:36

标签: python string

我正在尝试使用已知的密钥矩阵创建一个破解Hill密码的程序,当我输入密文并将字母转换为数字时,我将其用于循环:

letters = 'abcdefghijklmnopqrstuvwxyz'

ciphertext = input('Enter your ciphertext')
ciphertext = list(ciphertext.lower())

for symbol in ciphertext:
        num = int(letters.find(symbol))
        print(num)

我想知道是否有办法将打印的数字传输到数组中,我用它来表示Hill密码中涉及的矩阵,因为我需要将每个2个字母的块插入到2x1矩阵,以便对每个矩阵进行矩阵乘法,以获得明文。

基本上,我试图以最有效的方式将for循环中的数字转换为数组,但我在python中编码非常新,所以我不知道我会怎么做。

另外,在python中使用矩阵是否只是一种更简单的方法,我不知道这将使整个事情变得更容易?

3 个答案:

答案 0 :(得分:2)

看起来您想要在列表中返回字符的ASCII值。您可以使用列表推导在线性时间内完成此操作。

symbols = 'axy12c'

lst = [ord(c) - ord('a') if c.isalpha() and c.islower() else -1 for c in symbols]

print(lst)
[0, 23, 24, -1, -1, 2]

既然你提到数组,那么这也是一种愚蠢的方式,瞧瞧。

arr = np.array(list(symbols), dtype='|S1').view(np.int8) - 97
arr[(0 > arr) | (25 < arr)] = -1

print(arr)
array([ 0, 23, 24, -1, -1,  2], dtype=int8)

答案 1 :(得分:1)

是的,你应该使用列表理解:

letters = 'abcdefghijklmnopqrstuvwxyz'
ciphertext = input().lower()

indices = [letters.find(c) for c in ciphertext]

这会将letters.find(c)附加到c中每个字母(此处称为ciphertext)的索引。

但如果letters始终是字母表(并且它看起来像维基百科那样),你可以使用ord来加快速度,它会为你提供每个字母的ASCII索引。要使其'a'0,您只需减去ord('a')

ciphertext = input().lower()
indices = [ord(c) - ord('a') for c in ciphertext]

查看维基百科的Hill Cipher,看起来你所描述的并不完全符合你的需要。

我的理解是你的关键必须是一个完美的正方形(n ^ 2)。然后,您将密钥整形为nn矩阵,并将其乘以明文的n个块。你应该研究numpy。它有很多用于处理矩阵的工具,我很确定你可以用几行来表达这个密码:

import numpy as np

ciphertext = np.array(map(ord, input().lowercase())) - ord('a')
n = int(sqrt(len(ciphertext)))
assert n**2 == len(ciphertext), 'ciphertext must be perfect square in length'

ciphertext.reshape((n, n))  # Make ciphertext a nxn matrix
# Matrix multiply plaintext chunks of n by ciphertext
plaintext.reshape((n, -1)) @ ciphertext

似乎密文也必须是可逆的。 numpy allows you to check that the ciphertext is invertible (and compute its inverse),而不必自己编写linalg内容。

答案 2 :(得分:0)

这是将它们列入清单的方法。

letters = 'abcdefghijklmnopqrstuvwxyz'
ciphertext = input('Enter your ciphertext')
ciphertext = list(ciphertext.lower())
desiredArray = list(map(lambda x: int(letters.find(x)), ciphertext))

这将您的查找和转换定义为&#34; lambda&#34;功能; &#34;地图&#34;函数将lambda函数映射到密文的元素,以及&#34; list&#34; function将结果转换为列表。这些都是值得学习的python。