Почему я не могу разрезать столбец так же, как строку? - PullRequest
2 голосов
/ 28 октября 2019

У меня есть доска Судоку в этом списке,

board = [   ['.', 2, '.', '.', '.', 4, 3, '.', '.'], 
            [9, '.', '.', '.', 2, '.', '.', '.', 8], 
            ['.', '.', '.', 6, '.', 9, '.', 5, '.'], 
            ['.', '.', '.', '.', '.', '.', '.', '.', 1], 
            ['.', 7, 2, 5, '.', 3, 6, 8, '.'], 
            [6, '.', '.', '.', '.', '.', '.', '.', '.'], 
            ['.', 8, '.', 2, '.', 5, '.', '.', '.'], 
            [1, '.', '.', '.', 9, '.', '.', '.', 3], 
            ['.', '.', 9, 8, '.', '.', '.', 6, '.']    ]

Я могу легко проверить, присутствует ли определенное значение в строке или нет, value in board[row][:], но я не могу сделать то же самоевещь для колонны. Например, когда я пишу value in board[:][col] , он каким-то образом выбирает row, проиндексированный со значением col, а затем пытается найти указанное value.

Например,print(board[6][:]) дает ['.', 8, '.', 2, '.', 5, '.', '.', '.'] ( 7-я строка ), а print(board[:][2]) дает ['.', '.', '.', 6, '.', 9, '.', 5, '.'] ( 3-я строка ). Я действительно запутался, почему это так.

Мой вопрос: существует ли эквивалентный синтаксис board[row][:] для столбца? И что более важно, почему board[:][col] не работает?

Ответы [ 3 ]

3 голосов
/ 28 октября 2019

Эквивалентный синтаксис: zip(*board)[2][:]:

>>> zip(*board)[2][:]
('.', '.', '.', '.', 2, '.', '.', '.', 9)
>>> 2 in zip(*board)[2][:]
True

См. документацию для zip().

Ваш метод не работает, поскольку board[:] означает«все строки», то есть то же самое, что и board. Так что board[:][2] эквивалентно board[2]. Вам также не нужна часть [:] в value in board[row][:].

Для ясности, синтаксис [:] обычно используется для копирования , как упоминалось в @VPfB. Поскольку вы только читаете список, это не имеет значения (и фактически немного менее эффективно, потому что вы создаете копию всей платы в памяти).

0 голосов
/ 28 октября 2019

Если вы используете NumPy, вы можете легко получить доступ к значениям столбца.

>> board = numpy.array([
    [".", 2, ".", ".", ".", 4, 3, ".", "."],
    [9, ".", ".", ".", 2, ".", ".", ".", 8],
    [".", ".", ".", 6, ".", 9, ".", 5, "."],
    [".", ".", ".", ".", ".", ".", ".", ".", 1],
    [".", 7, 2, 5, ".", 3, 6, 8, "."],
    [6, ".", ".", ".", ".", ".", ".", ".", "."],
    [".", 8, ".", 2, ".", 5, ".", ".", "."],
    [1, ".", ".", ".", 9, ".", ".", ".", 3],
    [".", ".", 9, 8, ".", ".", ".", 6, "."],
])

>> board[:,0]
>> array([".", 9, ".",".",".",6,".",1,"."])
0 голосов
/ 28 октября 2019

Ваша путаница связана с тем, как работает индексация в Python. Это может немного прояснить ситуацию:

board = [
    [".", 2, ".", ".", ".", 4, 3, ".", "."],
    [9, ".", ".", ".", 2, ".", ".", ".", 8],
    [".", ".", ".", 6, ".", 9, ".", 5, "."],
    [".", ".", ".", ".", ".", ".", ".", ".", 1],
    [".", 7, 2, 5, ".", 3, 6, 8, "."],
    [6, ".", ".", ".", ".", ".", ".", ".", "."],
    [".", 8, ".", 2, ".", 5, ".", ".", "."],
    [1, ".", ".", ".", 9, ".", ".", ".", 3],
    [".", ".", 9, 8, ".", ".", ".", 6, "."],
]

first = board[0]
second = board[0][0]

# Prints the row, as expected.
print(first)  # ['.', 2, '.', '.', '.', 4, 3, '.', '.']

# Prints the value of the INDEX in the row[0].
print(second)  # .

# Finds the actual column values by iterating through the values in index 0 of all the rows.
column = []
for row in board:
    column.append(row[0])  # Row number 0.

print(column) # ['.', 9, '.', '.', '.', 6, '.', 1, '.']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...