您可以使用映射将字母转换为数字。这样的映射很容易从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()
需要几乎三倍的时间。