Итак, я делаю игру, и у меня есть словарь кортежей, содержащий координаты объектов на игровом поле, который выглядит следующим образом (например):

location = {player : (1, 4), monster : (3, 2), escape : (4, 0)}

Позже в моем коде я хочу изменить координаты, чтобы было легче понять области. Первой определяющей частью будет соответствующая буква, а затем второе число, похожее на это: игрок будет в B4, монстр в C2 и так далее. верхняя правая «область» представлена кортежем (4, 4), а нижняя левая «область» представлена кортежем (0, 0). Единственное, что я смог придумать, это может сработать, это что-то вроде этого:

location = {player : (1, 4), monster : (3, 2), escape : (4, 0)}
letters = ["A", "B", "C", "D", "E"]
playerArea = "{}{}".format(letters[int(location[player[0]])+1], location[player[1]])

Короче говоря, это не сработало. Я думаю, что проблема заключается в распаковке кортежей из словаря и использовании его в качестве числа, чтобы получить букву из списка букв. Извините, это сбивало с толку, я постараюсь ответить на все ваши вопросы.

3
NoahSonic123 28 Авг 2017 в 00:01

3 ответа

Лучший ответ

Суть вопроса заключается в том, как преобразовать числовые координаты строки / столбца в нечто более удобочитаемое (в стиле линейного корабля). Вот простая и быстрая функция для этого:

>>> def rc_to_abc(x, y):
        return 'ABCDEFGHIJKLOMOPQRSTUVWXYZ'[x] + str(y)

>>> rc_to_abc(1, 4)
'B4'
>>> rc_to_abc(3, 2)
'D2'
>>> rc_to_abc(4, 0)
'E0'
6
MSeifert 27 Авг 2017 в 21:32

Используйте словарное понимание , используя форматирование строки, чтобы создать новые значения. Распаковка значений-кортежей выполняется легко:

location = {k: '{}{}'.format(letters[x-1], y) for k, (x, y) in location.items()}
print(location)
# {'player': 'A4', 'monster': 'C2', 'escape': 'D0'}

Кроме того, вы можете использовать string.ascii_uppercase вместо определение списка алфавитов вручную.

OTOH, поскольку у вашей доски предположительно (0, 0) нет уверенности в том, что вы намерены сделать из индекса 0, поскольку A уже принят за 1.

3
Moses Koledoye 27 Авг 2017 в 21:21

Вы можете использовать string.ascii_uppercase, чтобы получить полный список алфавита для каждой координаты:

from string import ascii_uppercase as alphabet

location = {"player":(1, 4), "monster":(3, 2), "escape":(4, 0)}

new_location = {a:alphabet[b[0]-1]+str(b[-1]) for a, b in location.items()}

print(new_location)

Выход:

{'player': 'A4', 'monster': 'C2', 'escape': 'D0'}
0
Ajax1234 27 Авг 2017 в 21:25