1

我正在为 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']]

我想知道如何在表格中找到一个字母的位置,该位置给出行和列的输出。

我在网上寻找不同的解决方案,但似乎无法使其正常工作。

4

6 回答 6

4

这是你要找的吗?

def find_index(table, letter):
    for r_index, row in enumerate(table):
        if letter in row:
            return (r_index, row.index(letter))

您遍历表,并在每一行中搜索字母的索引。


或者,如果您不断在矩阵中搜索,将其转换为 dict 可能会更有效,这样您就可以获得 O(1) 访问权限:

def get_index_map(table):
    output = {}
    for r_index, row in enumerate(table):
        for c_index, letter in enumerate(row):
            output[letter] = (r_index, c_index)
    return output

然后,您可以在程序开始时调用此函数一次,并使用返回的 dict 查找每个字母的行号和列号。

于 2013-10-29T00:50:13.697 回答
3

我的看法:

>>> lst = [['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']]
>>> get = "S"
>>> {x:y.index(get) for x,y in enumerate(lst) if get in y}
{3: 3}
>>> get = "V"
>>> {x:y.index(get) for x,y in enumerate(lst) if get in y}
{4: 1}
>>>
于 2013-10-29T01:03:10.213 回答
1

这是我奇怪的方式。:) 注意:Python 2.7 所以/意味着整数除法。

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

tablestring = ''.join(''.join(row) for row in table)
x = tablestring.index('V')
i = x / (len(tablestring) / len(table))
j = x % (len(tablestring) / len(table))
print i, j
print table[i][j]

印刷:

4 1
V
于 2013-10-29T01:11:34.250 回答
1
data = [['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']]

search = "I"

for rowIdx, row in enumerate(data):
    if search in row:
        print rowIdx, row.index(search)
        break

输出

1 3
于 2013-10-29T00:50:41.877 回答
1
from itertools import product

li = [['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']]

letter = 'P'

for i, j in product(range(len(li)),range(len(li[0]))):
    if li[i][j] == letter:
        print (i,j)
        break
于 2013-10-29T00:53:24.783 回答
0

这是另一种方式:

matrix=[['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 index(letter, matrix):
    for i,li in enumerate(matrix):
        try:
            j=li.index(letter)
            return i,j
        except ValueError:
            pass    

    raise ValueError("'{}' not in matrix".format(letter))

print index('H', matrix)     
# (1, 2) 
print index('a', matrix) 
# ValueError
于 2013-10-29T00:58:27.493 回答