为什么我不能像行一样切一列?

时间:2019-10-28 06:29:14

标签: python list

我有一个数独板作为此列表,

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, '.']第三行 )。 我真的很困惑为什么会这样。

我的问题是,某列是否具有board[row][:]的等效语法?更重要的是为什么board[:][col]不起作用?

3 个答案:

答案 0 :(得分:3)

等效语法为zip(*board)[2][:]

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

请参见documentation for zip()

您的方法无效,因为board[:]表示“所有行”,即与board相同。因此board[:][2]等效于board[2]。您也不需要[:]中的value in board[row][:]部分。

要清楚,{@ {3}}通常使用[:]语法,如@VPfB所述。由于您只阅读列表,所以没关系(事实上,效率很低,因为您正在创建整个板的内存中副本)。

答案 1 :(得分:0)

如果使用的是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,"."])

答案 2 :(得分:-1)

您的困惑在于如何在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, '.']