Valid Sudoku

Determine if a 9 x 9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:

Each row must contain the digits 1-9 without repetition.
Each column must contain the digits 1-9 without repetition.
Each of the nine 3 x 3 sub-boxes of the grid must contain the digits 1-9 without repetition.
Note:

A Sudoku board (partially filled) could be valid but is not necessarily solvable.
Only the filled cells need to be validated according to the mentioned rules.

Example 1:
Input: board = 
[["5","3",".",".","7",".",".",".","."]
,["6",".",".","1","9","5",".",".","."]
,[".","9","8",".",".",".",".","6","."]
,["8",".",".",".","6",".",".",".","3"]
,["4",".",".","8",".","3",".",".","1"]
,["7",".",".",".","2",".",".",".","6"]
,[".","6",".",".",".",".","2","8","."]
,[".",".",".","4","1","9",".",".","5"]
,[".",".",".",".","8",".",".","7","9"]]
Output: true

Example 2:
Input: board = 
[["8","3",".",".","7",".",".",".","."]
,["6",".",".","1","9","5",".",".","."]
,[".","9","8",".",".",".",".","6","."]
,["8",".",".",".","6",".",".",".","3"]
,["4",".",".","8",".","3",".",".","1"]
,["7",".",".",".","2",".",".",".","6"]
,[".","6",".",".",".",".","2","8","."]
,[".",".",".","4","1","9",".",".","5"]
,[".",".",".",".","8",".",".","7","9"]]
Output: false
Explanation: Same as Example 1, except with the 5 in the top left corner being modified to 8. Since there are two 8's in the top left 3x3 sub-box, it is invalid.

from typing import List

class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        rows = set()
        cols = set()
        cube = set()
        
        for r in range(len(board)):
            for c in range(len(board[0])):
                
                digit = board[r][c]
                if digit == ".": continue
                
                print(r, c, digit, cube)
                
                if (r,digit) in rows:          return False
                if (c,digit) in cols:          return False
                if (r//3,c//3,digit) in cube:  return False
                
                rows.add((r,digit))
                cols.add((c,digit))
                cube.add((r//3,c//3,digit))
        
        return True
    
    def isValidSudoku(self, board: List[List[str]]) -> bool:        
        cube = []
        
        for row in range(len(board)):
            temp = []
            t_c = []
            for n in range(len(board[0])):
                if board[row][n] != ".": 
                    temp.append(board[row][n])
                
                # for check cubes
                if (n+1) % 3 == 0: 
                    if board[row][n] != ".": t_c.append(board[row][n],)
                    cube.append(t_c)
                    t_c = []
                else:
                    if board[row][n] != ".": t_c.append(board[row][n],)
                    
            if len(set(temp)) != len(temp): return False

        for i in range(3):     
            if len(set(sum(cube[i::3][0:3], []))) != len(sum(cube[i::3][0:3], [])): return False
            if len(set(sum(cube[i::3][3:6], []))) != len(sum(cube[i::3][3:6], [])): return False
            if len(set(sum(cube[i::3][6:9], []))) != len(sum(cube[i::3][6:9], [])): return False
 
        for n in range(len(board[0])):
            temp = []
            for row in range(len(board)):
                if board[row][n].isnumeric(): temp.append(board[row][n])
            if len(set(temp)) != len(temp): return False
        
        return True
        
        
s = Solution()

print(s.isValidSudoku([
[".",".",".",".",".",".","5",".","."],
[".",".",".",".",".",".",".",".","."],
[".",".",".",".",".",".",".",".","."],
["9","3",".",".","2",".","4",".","."],
[".",".","7",".",".",".","3",".","."],
[".",".",".",".",".",".",".",".","."],
[".",".",".","3","4",".",".",".","."],
[".",".",".",".",".","3",".",".","."],
[".",".",".",".",".","5","2",".","."]]))#false

print(s.isValidSudoku([
 ["5","3",".",".","7",".",".",".","."]
,["6",".",".","1","9","5",".",".","."]
,[".","9","8",".",".",".",".","6","."]
,["8",".",".",".","6",".",".",".","3"]
,["4",".",".","8",".","3",".",".","1"]
,["7",".",".",".","2",".",".",".","6"]
,[".","6",".",".",".",".","2","8","."]
,[".",".",".","4","1","9",".",".","5"]
,[".",".",".",".","8",".",".","7","9"]]))#true

print(s.isValidSudoku([
 ["8","3",".",".","7",".",".",".","."]
,["6",".",".","1","9","5",".",".","."]
,[".","9","8",".",".",".",".","6","."]
,["8",".",".",".","6",".",".",".","3"]
,["4",".",".","8",".","3",".",".","1"]
,["7",".",".",".","2",".",".",".","6"]
,[".","6",".",".",".",".","2","8","."]
,[".",".",".","4","1","9",".",".","5"]
,[".",".",".",".","8",".",".","7","9"]])) #false