对标**leetcode:36.有效的数独**
写这个题解主要是为了记一下怎么在python取一个二维列表的每一列,还有怎么取每个3*3的小二维数组。
注意:!!!此题中的元素都是字符,所以判断的时候不能与数字比较,要跟字符比较!!!
python如何取二维数组的每一列
以此题为例,二维列表的第一列应该这样写: [arr[0] for arr in board] 以此类推,取每一列应该是: [[arr[idx] for arr in board] for idx in range(9)] 我们在这个题目中,每次取一列,可以这样写:
for i in range(9):
for k in range(1, 10):
if [arr[i] for arr in board].count(str(k)) > 1:
return False
python如何取固定大小的二维数组
比如此题中的9 * 9的数组中取左上角的3 * 3的数组,应该这样写: [i[j] for j in range(3) for i in board[0:3]] 依此类推,我们要取9个3*3的小二维数组,应该这样写:
for i in range(3):
for j in range(3):
for k in range(1, 10):
if [arr[idx] for idx in range(3*j,3*(j+1)) for arr in board[3*i:3*(i+1)]].count(str(k)) > 1:
return False
全部代码如下:
class Solution:
def isValidSudoku(self, board: List[List[str]]) -> bool:
for row in board:
for i in range(1, 10):
if row.count(str(i)) > 1:
return False
for i in range(9):
for k in range(1, 10):
if [arr[i] for arr in board].count(str(k)) > 1:
return False
for i in range(3):
for j in range(3):
for k in range(1, 10):
if [arr[idx] for idx in range(3*j,3*(j+1)) for arr in board[3*i:3*(i+1)]].count(str(k)) > 1:
return False
return True
|