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

行と列は、通常の 0、1、2、3、4、5 ではなく、A、B、C、D、E、F として参照されます。したがって、文字を数字に変換してから、ネストされたリストでアイテムを見つける必要があります。

たとえば、ユーザーが次のように入力した場合: 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は簡単です。E4

>>> 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 倍の時間がかかります。

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

これが機能する理由は、文字セットが何であってもord(x)character の値を返すためです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
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 に答える
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 に答える