Trois grilles correctes:

In [1]:
A = [ [3,6,7,9,4,1,2,8,5],
      [1,5,2,6,8,3,4,9,7],
      [4,9,8,7,5,2,1,6,3],
      [7,4,6,1,9,5,8,3,2],
      [8,1,9,2,3,7,6,5,4],
      [2,3,5,8,6,4,7,1,9],
      [9,2,1,5,7,8,3,4,6],
      [5,8,4,3,2,6,9,7,1],
      [6,7,3,4,1,9,5,2,8]
    ]  
In [2]:
B = [ [4,2,7,9,5,1,6,8,3],
      [6,3,9,2,8,4,7,5,1],
      [8,5,1,7,6,3,9,2,4],
      [5,1,4,8,9,6,3,7,2],
      [9,7,6,4,3,2,8,1,5],
      [2,8,3,1,7,5,4,9,6],
      [3,9,2,6,1,8,5,4,7],
      [7,4,5,3,2,9,1,6,8],
      [1,6,8,5,4,7,2,3,9]
    ]
In [3]:
C = [ [9,8,5,1,3,2,4,7,6],
      [2,7,3,9,4,6,5,1,8],
      [4,1,6,5,7,8,9,2,3],
      [1,6,7,4,8,9,2,3,5],
      [8,5,2,6,1,3,7,9,4],
      [3,9,4,2,5,7,8,6,1],
      [7,4,1,3,9,5,6,8,2],
      [5,2,9,8,6,1,3,4,7],
      [6,3,8,7,2,4,1,5,9]
    ]

Une grille incorrecte (problème en ligne 2 et en colonne 2):

In [4]:
D = [ [9,8,5,1,3,2,4,7,6],
      [2,9,3,9,4,6,5,1,8],
      [4,1,6,5,7,8,9,2,3],
      [1,6,7,4,8,9,2,3,5],
      [8,5,2,6,1,3,7,9,4],
      [3,9,4,2,5,7,8,6,1],
      [7,4,1,3,9,5,6,8,2],
      [5,2,9,8,6,1,3,4,7],
      [6,3,8,7,2,4,1,5,9]
    ]
In [5]:
CHIFFRES = (1,2,3,4,5,6,7,8,9)        

def verifieLigne(grille, numero_de_ligne):
    """
    grille -- matrice suddoku
    numero_de_ligne -- numéro de ligne de la grille (entre 0 et 8)

    renvoie True si la ligne contient chacun des chiffres une fois et une seule, 
    False sinon.
    """
    for chiffre in CHIFFRES:
        if chiffre not in grille[numero_de_ligne]:
            return False
    return True
In [6]:
def verifieLignes(grille):
    """
    grille -- matrice sudoku

    renvoie True si chaque ligne respecte les règles du Sudoku, False sinon.
    """
    for numero_de_ligne in range(9):
        if not verifieLigne(grille, numero_de_ligne):
            return False
    return True
In [7]:
def verifieColonne(grille, num_colonne):
    """
    grille -- matrice suddoku
    numero_de_colonne -- numéro de colonne de la grille (entre 0 et 8)

    renvoie True si la colonne contient chacun des chiffres 
    une fois et une seule, False sinon.
    """
    colonneDeChiffres = [grille[num_ligne][num_colonne] for num_ligne in range(9)]
    for chiffre in CHIFFRES:
        if chiffre not in colonneDeChiffres:
            return False
    return True
In [8]:
def verifieColonnes(grille):
    """
    grille -- matrice sudoku

    renvoie True si chaque colonne respecte les règles du Sudoku, False sinon.
    """
    for num_colonne in range(9):
        if not verifieColonne(grille, num_colonne):
            return False
    return True 
In [11]:
def verifieCarre(grille, numero):
    """
    grille -- matrice 9*9 sudoku
    numero -- numéro entre 0 et 8 d'une zone carrée 

    renvoie True si la zone contient exactement une fois chacun des chiffres de 1 à 9, False sinon.
    """
    ligneHG = 3*(numero//3)  # numéro de ligne de la cellule haute gauche du carré
    colonneHG = 3*(numero%3) # numéro de colonne de la cellule haute gauche du carré
    carreDeChiffres = [grille[i][j] for i in range(ligneHG, ligneHG+3) for j in range(colonneHG, colonneHG+3)]
    for chiffre in CHIFFRES:
        if chiffre not in carreDeChiffres:
            return False
    return True 
In [12]:
def verifieCarres(grille):
    """
    grille -- matrice 9*9 sudoku

    renvoie True si chaque carré est rempli en respectant les règles sudoku, False sinon.
    """
    for num_carre in range(9):
        if not verifieCarre(grille, num_carre):
            return False
    return True
In [13]:
def verifieGrille(grille):
    """
    grille -- matrice 9*9 sudoku

    renvoie True si grille est remplie suivant les règles du sudoku, False sinon.
    """
    if not verifieLignes(grille): return False
    if not verifieColonnes(grille): return False
    if not verifieCarres(grille): return False
    return True
In [14]:
verifieGrille(A)
Out[14]:
True
In [15]:
verifieGrille(B)
Out[15]:
True
In [16]:
verifieGrille(C)
Out[16]:
True
In [17]:
verifieGrille(D)
Out[17]:
False
In [ ]: