Python-编码两个字母
我试图创建一个python playfair密码,但在创建过程中遇到了一些问题。我有一张五乘五的桌子,上面有以下信息:Python-编码两个字母,python,Python,我试图创建一个python playfair密码,但在创建过程中遇到了一些问题。我有一张五乘五的桌子,上面有以下信息: [['A', 'B', 'C', 'D', 'E'], ['F', 'G', 'H', 'I', 'Y'], ['K', 'L', 'M', 'N', 'O'], ['P', 'Q', 'R', 'S', 'T'], ['U', 'V', 'W', 'X', 'Z']] 我应该一次加密两封信。当给定输入encrypt(B,N)时,结果输出应该是DL。输入中的第一个字
[['A', 'B', 'C', 'D', 'E'],
['F', 'G', 'H', 'I', 'Y'],
['K', 'L', 'M', 'N', 'O'],
['P', 'Q', 'R', 'S', 'T'],
['U', 'V', 'W', 'X', 'Z']]
我应该一次加密两封信。当给定输入encrypt(B,N)时,结果输出应该是DL。输入中的第一个字母应返回与B相同的行中的字母,但该行有N列。我希望有人能为我解释一种实现这一点的方法
在友好用户的帮助下,下面是一些代码:
def find_index(letter, table):
for i,li in enumerate(table):
try:
j=li.index(letter)
return i,j
except ValueError:
pass
raise ValueError("'{}' not in matrix".format(letter))
print "Row:Column"
print find_index('I', table)
def encode(a, b):
if a == b:
print "ERROR: letters to encode_pair must be distinct"
print find_index (a,table)
print find_index (b, table)
这就是你想要的吗:
In [25]: table = [['A', 'B', 'C', 'D', 'E'],
['F', 'G', 'H', 'I', 'Y'],
['K', 'L', 'M', 'N', 'O'],
['P', 'Q', 'R', 'S', 'T'],
['U', 'V', 'W', 'X', 'Z']]
In [26]: def encrypt(B, N):
b = [L.index(B) for L in table if B in L][0]
answer = [L for L in table if N in L][0][b]
b = [L.index(N) for L in table if N in L][0]
answer = answer,[L for L in table if B in L][0][b]
return answer
In [27]: encrypt("B", "N")
Out[27]: ('L', 'D')
您可以在python中使用ord()获取字符的ASCII值 前任 s='A' 变更=chr(ord+2)
因此,产生的输出是change_s='C'您需要保存find_index(a,table)和find_index(a,table)的返回,如果我理解正确,这就是您需要实现的代码类型
def encode(a, b):
if a == b:
print "ERROR: letters to encode_pair must be distinct"
print find_index (a,table)
print find_index (b, table)
index_a= find_index (a,table)
index_b = find_index (a,table)
new_a_index = [index_a[0], index_b[1]]
new_b_index = [index_b[0], index_a[1]]
new_a = table[new_a_index]
new_b = table[new_b_index]
最后的步骤可以一步完成,但我试图弄清楚,以确保你理解我在做什么,并在我误解时纠正我,这很有趣。。。谢谢
In [2]:
class Encoder(object):
m = [['A', 'B', 'C', 'D', 'E'],
['F', 'G', 'H', 'I', 'Y'],
['K', 'L', 'M', 'N', 'O'],
['P', 'Q', 'R', 'S', 'T'],
['U', 'V', 'W', 'X', 'Z']]
def encode(self, first, second):
first_row_idx, first_col_idx = self.get_rowcol(first)
second_row_idx, second_col_idx = self.get_rowcol(second)
encoded_first = self.m[first_row_idx][second_col_idx]
encoded_second = self.m[second_row_idx][first_col_idx]
return encoded_first, encoded_second
def get_rowcol(self, letter):
letter = letter.upper()
for row_idx, row in enumerate(self.m):
for col_idx, col_letter in enumerate(row):
if col_letter == letter:
return row_idx, col_idx
raise ValueError("({}) not found in matrix!".format(letter))
e = Encoder()
e.encode("B", "N")
Out[2]:
('D', 'L')
可能是这个吗
>>> from itertools import chain
>>> cl=[['A', 'B', 'C', 'D', 'E'],
['F', 'G', 'H', 'I', 'Y'],
['K', 'L', 'M', 'N', 'O'],
['P', 'Q', 'R', 'S', 'T'],
['U', 'V', 'W', 'X', 'Z']]
>>> M = list(chain(*cl))
>>> N = len(cl[0])
>>> def e(a, b):
ia,ib = M.index(a), M.index(b)
ar,ac = ia / N, ia % N
br,bc = ib / N, ib % N
return M[ar*N + bc], M[br*N + ac]
>>> e('B','N')
# ('D', 'L')
我想他也需要D——广场的另一个角落。你好,谢谢你及时回复,但我似乎有点麻烦。当我试图运行代码时,我收到以下错误:“TypeError:list索引必须是整数,而不是list”。有没有办法解决这个问题。我看到了我创建的问题。我没有严格按照规范思考。您将只希望最后四行中的每一行在两行中简化此操作
code new_a=table[index_b[0]][index_a[1]
new_b=table[index_a[0]][index_b[1]
我可能将行/列弄混了,因此您可能需要重新排序,但这应该可以解决出现的类型错误,因为new_a和new_b被提供了索引列表,而不是两个索引。再次感谢您的响应,但我似乎仍然无法使其正常工作。也许我在解释任务方面做得不好。以下是支持程序运行的方式:从1:00开始,解释规则。我试图用你提出的想法来创建其余的规则,但我无法做到。如果你能进一步帮助我,那将是令人惊讶的,但我理解如果你不这样做。无论如何,谢谢你。我刚刚运行了它,它工作了。我想您可能有输入问题,您是否遇到此错误<代码>回溯(最后一次调用):文件“”,第1行,名称错误:new_a=tablez[index_b[0]][index_a[1]]new_b=tablez[index_a[0]][index_b[1]
实际上是正确的。我猜您遇到的问题是,您试图传递一个名为a的变量,而不是传递字符串“a”