マッピングを使用して、文字を数字に変換できます。このようなマッピングは、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 ベースにする) か、on を使用.index()
します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
ディクショナリ (マッピング) アプローチが最も高速です。usingはわずかord()
に遅れており (計算ord('A')
が 1 回だけの場合)、using.index()
はほぼ 3 倍の時間がかかります。