Python: erreur list index out of range

Résolu/Fermé
Signaler
-
 camapa -
Bonjour,
je suis entrain de faire un code pour mes cours on doit coder un démineur, je ne parviens pas a résoudre un problème qui m'indique index out of range voici mon programme:

def mines_autour(T):
 for i in range(n):
  L=[]
  for j in range(m):
   L.append(0)
  M.append(L)
  
  for i in range(len(T)) :
   for j in range(len(T[i])) :
     if T[i][j]==2:
      if i-1>=0:
       M[i-1][j]=M[i][j]+1
      if i+1<len(M)-1:
       M[i+1][j]=M[i][j]+1
      if j+1<len(T[i])-1:
       M[i][j+1]=M[i][j]+1
      if j-1>=0:
       M[i][j-1]=M[i][j]+1   
 return(M)
print(mines_autour(T))


mon problème se trouve au niveau des if
A voir également:

5 réponses

Messages postés
3671
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
1 005
Bonjour,

Ton problème doit se situer au niveau des bords : tu fais M[i+1] et autres M[][j-1] sans vérifier que ces valeurs existent.

Xavier
1
Avec mon if je suis pas sensé vérifier que ça existe justement
0
Messages postés
3671
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
1 005 > Camapa
Au temps pour moi j'avais vraiment lu ton code trop vite.
Par contre, sur le troisième if
      if j+1<len(T[i])-1:
       M[i][j+1]=M[i][j]+1

Tu vérifies la taille par rapport à T alors qu'ensuite tu prends dans M.
Es-tu sûr qu'elles ont la même taille ?
0
>
Messages postés
3671
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021

bonjour,
oui ce sont exactement la même taille on fait M a partir de T, et même en changeant T par M le problème persiste je ne le comprend vraiment pas
0
Messages postés
50796
Date d'inscription
mardi 8 janvier 2008
Statut
Modérateur
Dernière intervention
30 janvier 2021
7 640
Bonjour,

Merci pour cette information. As-tu une question ?

Pour rappel :
Les réponses sont données par des bénévoles, pas par des machines. Il est vivement recommandé d'user des formes minimales de la politesse ("bonjour', "s'il vous plait", "merci d'avance") pour rester dans le cadre de notre charte d'utilisation.

Un détail :
quand tu saisis ton code (un copié-collé fait l'affaire) dans la fenêtre d'édition, pense à lui attribuer la couleur syntaxique et la forme correcte avec le bouton
<>
.
0
d'accords excusez moi c'est la première fois que je pose une question je ne savais pas comment faire.
0
Messages postés
50796
Date d'inscription
mardi 8 janvier 2008
Statut
Modérateur
Dernière intervention
30 janvier 2021
7 640 > camapa
;-)
0
Messages postés
18266
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 janvier 2022
998
peux-tu fournir un code testable, qui montre le problème?
0
Messages postés
18266
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 janvier 2022
998
et préciser à quelle ligne se produit l'erreur.
0
Messages postés
18266
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 janvier 2022
998
as-tu ajouté des print pour vérifier que ton programme se comporte comme tu l'imagines?
c'est bien d'écrire "on fait M a partir de T", c'est encore mieux de le vérifier.
je pense qu'ainsi tu découvriras rapidement ton erreur.
0
def Int_jeu(n,m,d):
 while n<2:
  n=int(input("entrer le nombre de ligne supéreiur ou égale à 2: "))
 while m<2:
  m=int(input("entrer le nombre de collone supéreiur ou égale à 2: "))
 while n*m<9:
  if n<3:
   n=int(input("entrer le nombre de ligne supérieur à 3: "))
  elif m<3:
   m=int(input("entrer le nombre de collone supérieur à 3: "))
   
 for i in range(n):
  L=[]
  for j in range(m):
   L.append(0)
  T.append(L)

 if(d==1):
  x=(n*m)*15//100
  if x<1:
   x=1
  for i in range(x):
   i=randint(0,n-1)
   j=randint(0,m-1)
   T[i][j]=2
     
 elif(d==2):
  x=(n*m)*30//100
  if x<1:
   x=2
  for i in range(x):
   i=randint(0,n-1)
   j=randint(0,m-1)
   T[i][j]=2
  
 elif(d==3):
  x=(n*m)*45//100
  if x<1:
   x=3
  for i in range(x):
   i=randint(0,n-1)
   j=randint(0,m-1)
   T[i][j]=2
   
 elif(d==4):
  x=(n*m)*60//100
  if x<1:
   x=4
  for i in range(x):
   i=randint(0,n-1)
   j=randint(0,m-1)
   T[i][j]=2
  
 while d<0 or d>4:
  print("entrer un niveau disponible")
  d=int(input("entrer la dificulter voulu entre 1 et 4, (1 etant le plus simple) : "))  
 return(T)
print(Int_jeu(n,m,d))

def mines_autour(T):
 for i in range(n):
  L=[]
  for j in range(m):
   L.append(0)
  M.append(L)
  
 for i in range(len(M)) :
  for j in range(len(M[i])) :
    if T[i][j]==2:
     if i-1>=0:
      M[i-1][j]=M[i-1][j]+1
     if i+1<len(M):
      M[i+1][j]=M[i+1][j]+1
     if j+1<len(M[i]):
      M[i][j+1]=M[i][j+1]+1
     if j-1>=0:
      M[i][j-1]=M[i][j-1]+1
     if i-1>=0 and j-1>=0:
      M[i-1][j-1]=M[i-1][j-1]+1
     if i-1>=0 and j+1<len(M[i]):
      M[i-1][j+1]=M[i-1][j+1]+1
     if i+1<len(M) and j-1>=0:
      M[i+1][j-1]=M[i+1][j-1]+1
     if i+1<len(M) and j+1<len(M[i]):
      M[i+1][j+1]=M[i+1][j+1]+1
          
 return(M)
print(mines_autour(T))


c'est le programme presque au complet
0
j'ai trouvé mon probleme il etais au niveau des for merci de votre aide
0