0

可能重复:
如何在 Python 中搜索嵌套列表网格并给出字母坐标?

我目前有这个嵌套列表充当 6x6 网格:

grid = [["Z","9","G","Q","T","3"],
        ["Y","8","F","P","S","2"],
        ["X","7","E","O","R","1"],
        ["W","6","D","N","M","0"],
        ["V","5","C","L","K","U"],
        ["J","4","B","I","H","A"]]

行和列被称为 A、B、C、D、E、F,而不是通常的 0、1、2、3、4、5。因此需要将字母转换为数字,然后必须在嵌套列表中找到该项目。

例如,如果用户输入:FE CC ED ED CD 这应该找到 HELLO 的字母并打印出 HELLO 这个词,因为这是加密的消息。

任何有关我如何管理此问题的帮助将不胜感激。

4

5 回答 5

1

您可以使用映射将字母转换为数字。这样的映射很容易从string.ascii_uppercase字符串生成:

import string
letter_to_index = {l: i for i, l in enumerate(string.ascii_uppercase)}

然后使用letter_to_index它将字母(例如E)转换为数字(4)是微不足道的:

>>> letter_to_index['E']
4

使用空格分隔的输入,这变成:

letters = []
for coordinate in code.split():
    row, column = letter_to_index[coordinate[0]], letter_to_index[coordinate[1]]
    letters.append(grid[row][column])

print ''.join(letters)

其他技术用于ord()获取字母的 ASCII 序号(减去ord('A')以使其从 0 开始)或使用.index()on string.ascii_uppercase(这会更慢)。

将它们的相对速度与timeit模块进行比较是确定哪个是最快技术的最佳方法(如果您愿意的话):

>>> import timeit
>>> def lookup_map(coordinate):
...     return letter_to_index[coordinate[0]], letter_to_index[coordinate[1]]
... 
>>> def lookup_ord(coordinate, orda=ord('A')):
...     return ord(coordinate[0]) - orda, ord(coordinate[1]) - orda
... 
>>> def lookup_index(coordinate, upper=string.ascii_uppercase):
...     return upper.index(coordinate[0]), upper.index(coordinate[1])
... 
>>> coords = [random.choice(string.ascii_uppercase[:6])+random.choice(string.ascii_uppercase[:6]) for _ in range(1000)]
>>> timeit.timeit('[lookup(c) for c in coords]', 'from __main__ import coords, lookup_map as lookup', number=10000)
3.883746862411499
>>> timeit.timeit('[lookup(c) for c in coords]', 'from __main__ import coords, lookup_ord as lookup', number=10000)
4.582481861114502
>>> timeit.timeit('[lookup(c) for c in coords]', 'from __main__ import coords, lookup_index as lookup', number=10000)
9.782031059265137

字典(映射)方法是最快的;usingord()紧随其后(如果您ord('A')只计算一次),并且 using.index()需要几乎三倍的时间。

于 2013-01-06T12:48:33.423 回答
1
def letter_to_number(letter):
    return ord(letter.upper()) - ord('A')

之所以有效,是因为它会以任何字符集ord(x)返回字符的值x——而且,无论是 ASCII、Latin-1、UTF-8 还是其他字符,字母都是按顺序排列的。

您可以通过在交互式解释器中进行试验来看到这一点:

>>> ord('A')
65
>>> ord('B')
66
>>> ord('F')
70
>>> ord('F') - ord('A')
5
于 2013-01-06T12:50:51.967 回答
0

要将字符转换为整数,您可以这样做:

def char_to_num(char):
    return ord(char)-ord('A')

要访问网格中的字符,您可以执行以下操作(我假设输入称为input):

word = ""
for position in input.upper():
   word += grid[char_to_num(position[0])][char_to_num(position[1])]
于 2013-01-06T12:50:29.723 回答
0
>>> input_string = "FE CC ED ED CD"

# Convert input string into integers
# `ord()` converts 'A' to 65, 'B' to 66, etc
>>> pairs = [tuple(ord(letter) - ord('A') for letter in pair) for pair in input_string.split()]
[(5, 4), (2, 2), (4, 3), (4, 3), (2, 3)]

# Now just retrieve the tuples from the list of pairs
# And look up the index in the grid
>>> output = ''.join(grid[x][y] for x, y in pairs)
'HELLO'
于 2013-01-06T12:50:42.700 回答
0
index=input('Enter the index:')
index=list(index)
a=[ord(i)-ord('A') for i in index]
print(grid[a[0]][a[1]])
于 2013-01-06T12:55:42.053 回答