Python-编码两个字母

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。输入中的第一个字

我试图创建一个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。输入中的第一个字母应返回与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”