Привет, я кодировал консольную версию Minesweeper, просто чтобы изучить некоторые основы Python. Он использует систему координат, которая записана в словаре. Теперь я смог успешно реализовать это, но получить доступ или присвоить значение конкретному координатному ключу с использованием переменных для «x, y» координаты кажется ... неуклюжим. Я придумал два разных способа, но они не кажутся очень элегантными, когда мне приходится их использовать так часто.

for i in range(1, ROWS+1):
        for j in range(1, COLS+1):
            mine_field["%i,%i" % (i,j)] = 0

Или

for i in range(1, ROWS+1):
        for j in range(1, COLS+1):
            mine_field[",".join([i, j])] = 0

Он работает достаточно хорошо, но начинает выглядеть беспорядочно при присвоении или замене значений. Есть ли лучший способ сделать это?

Заранее спасибо.

1
Quark_Nova 24 Июл 2010 в 19:48

2 ответа

Лучший ответ

Почему бы просто не использовать кортеж в качестве ключа?

for i in range(1, ROWS+1):
    for j in range(1, COLS+1):
        mine_field[(i, j)] = 0 # you don't even need the parentheses!

Используя этот метод, вы можете использовать индексы, разделенные запятыми, например:

d = {(1,2):3}
print d[1, 2] # will print 3

И, кстати, почему вы используете индексы на основе единицы?

5
AndiDog 24 Июл 2010 в 15:55

Если вы сделаете mine_field списком списков, вы можете использовать более удобный синтаксис:

mine_field = [[0]*ROWS for i in range(COLS)]

mine_field[i][j] = 1
1
Ned Batchelder 24 Июл 2010 в 15:55