Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

TypeError: 'int' object is not subscriptable

0 votes

Bonjour,
Mon programme renvoie une erreur de ce type dans la fonction resoudre_simple() sans que je comprenne vraiment pourquoi,pourriez vousm'aider?

class Sudoku:
    x=[]

    def __init__(self):
            lignes=9
            colonnes=9
            grid=[[0]*colonnes for i in range (lignes)]
            self.grille=grid
            self.column=len(self.grille)
            self.line=len(self.grille[0])

    def lire_fichier_sudoku(self,fichier,ligne):
            with open(fichier,"r") as fich:
                    for i in range(ligne):
                            l=fich.readline().rstrip("\n\r")
                            x=list(map(int,list(str(l))))
                    i,j=0,0
                    c=0
                    for i in range(9):
                            for j in range(9):
                                    self.grille[i][j]=x[c]
                                    c+=1
                    return self.grille                     

    def saisir_sudoku(self):
            s=input("Saisir 81 caractères entre 0 et 9")
            try:
                    s=int(s)
                    x=list(map(int,list(str(s))))                                       
                    assert len(x)==81

                    i,j=0,0
                    c=0
                    for i in range(9):
                            for j in range(9):
                                    self.grille[i][j]=x[c]
                                    c+=1
                    return self.grille                     

            except AssertionError:

                    print("Vous n'avez pas saisi 81 caractères !")

            except ValueError:
                    print(" Attention, vous ne pouvez entrer que des caractères numériques !")

    def afficher_sudoku(self):
            i,j=0,0

            for i in range(9):
                    if i%3==0:
                            print ("--------------")                                
                    for j in range(9):
                            if j%3==0:
                                    print("|",end="")
                            print (self.grille[i][j],end="")
                    print ("|")
            print ("--------------")

    def est_valide(self):
            t=1
            f=-1
            a=[]*9


            for i in range(9):
                    for j in range (9):
                            a.append(self.grille[i][j])
                    k=0
                    while k<(len(a)-1):

                            if a[k]==a[k+1]:

                                    return f
                            k+=1


                    while len(a)>0:
                            a.pop()

            for j in range(9):
                    for i in range (9):
                            a.append(self.grille[i][j])
                    k=0
                    while k<(len(a)-1):
                            if a[k]==a[k+1]:

                                    return f
                            k+=1
                    while len(a)>0:
                            a.pop()

            for i in range(0,9,3):
                    for j in range(0,9,3):
                            for n in range(i,i+3):
                                    for l in range(j,j+3):
                                            a.append(self.grille[n][l])
                            k=0
                            while k<(len(a)-1):
                                    if a[k]==a[k+1]:
                                            return f
                                    k+=1
                            while len(a)>0:
                                    a.pop()

            return t

    def resoudre_simple(self):
            M=[[self.grille] for nbr in range(9)]
            for i in range(9):
                    for j in range(9):
                            for k in range(9):
                                    M[i][j][k]=0
                                    print(k)
                                    print(j)
                                    print(i)

                                    if self.grille[i][j]==k+1:
                                            for l in range(9):
                                                    for m in range(9):

                                                            M[l][m][k]=1
                                            for l in range(9):
                                                    for m in range(9):
                                                            M[l][m][k]=1
                                            for l in range(0,9,3):
                                                    for m in range(0,9,3):
                                                            for n in range(i,i+3):
                                                                    for o in range(j,j+3):
                                                                            M[i][j][k]=1

                                    if M[i][j][k]==0:
                                            self.grille[i][j]=k+1
demandé 26-Sep par cha
edité 26-Sep par bubulle

ajoute le message d'erreur complet, il indique en particulier l'instruction précise qui cause l'erreur, ce qui sera utile à tout le monde pour pouvoir t'aider.

1 Réponse

+2 votes

Après avoir testé le code, l'erreur se produit ici

  File "test.py", line 120, in resoudre_simple
    if self.grille[i][j]==k+1:
TypeError: 'int' object is not subscriptable

En fait, à ce moment, self.grille contient ça

[0, [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]]

alors qu'à l'initialisation, ça contenait ça

[[0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]]

la première liste de 9 entiers a été remplacée par un seul entier. Donc l'appel grille[i][j] ne peut pas marcher car il n'y a plus une liste en position 0, mais un entier qui n'est pas indexable car pas itérable (si je ne dis pas d'ânerie).
La ligne responsable de ce changement semble être

M[i][j][k]=0

Je pense que c'est lié au fait que le mode de création de M fait que cet objet contient au final de multiples références au même objet. Il vaudrait peut-être mieux créer M en utilisant une copie profonde de self.grille?

import copy
...
M=[[copy.deepcopy(self.grille)] for nbr in range(9)]

Mais je suis encore peu expérimenté en Python et je n'ai pas creusé pour tenter de comprendre l'algorithme, d'autant que je me demande si le code de la classe est complet

J'espère que ça t'aidera quand même un peu.

répondu 4-Oct par sifratus (150 points)
...