[python]Problème TypeError: 'int'

Problème TypeError: 'int' [python] - Python - Programmation

Marsh Posté le 26-06-2013 à 21:29:12    

Bonjour,
J'ai un problème avec mon code sur un automate cellulaire, j'ai essayer d'inserer la fonction:

Code :
  1. for i, j in ((i-1, j), (i, j-1), (i+1, j+1), (i-1, j-1), \
  2.                  (i+1, j), (i, j+1), (i+1, j-1), (i-1, j+1)):
  3.                 if grid[i%N][j%N]==0:
  4.                     count += 1
  5.             return count


 
dans :

Code :
  1. from random import randrange
  2. import random
  3. from copy import deepcopy
  4. def display(grid):
  5.     for i in range(N):
  6.         for j in range(N):
  7.             if grid[i][j]==0:
  8.                 print("*",end="" )
  9.             elif grid[i][j]==1:
  10.                 print(".",end="" )
  11.             else:
  12.                 print("#",end="" )
  13.         print()
  14. def init_state(N):
  15.     grid = [ [ randrange(3) for _ in range(N) ] for _ in range(N) ]
  16.    
  17.     if N%2 == 0:
  18.         grid[int(N/2)][int(N/2)] = 1
  19.     else:
  20.         grid[int(N/2 + 1)][int(N/2) + 1] = 1
  21.     return grid
  22. def next_grid(grid,N):
  23.     new_grid = deepcopy(grid)
  24.     count = 0
  25.     for i in range(N):
  26.         for j in range(N):
  27.             for i, j in ((i-1, j), (i, j-1), (i+1, j+1), (i-1, j-1), \
  28.                  (i+1, j), (i, j+1), (i+1, j-1), (i-1, j+1)):
  29.                 if grid[i%N][j%N]==0:
  30.                     count += 1
  31.             return count
  32.             if grid[i][j] == 0:
  33.                 new_grid[i][j] = 1
  34.             elif grid[i][j] == 1:
  35.                 new_grid[i][j] = 2
  36.             elif grid[i][j] == 2 and count == 2:
  37.                 new_grid[i][j] = 0
  38.     grid[:] = new_grid
  39.     return new_grid
  40. #programme#
  41. N=11
  42. A=init_state(N)
  43. display(A)
  44. for t in range(1,6):
  45.     B= next_grid(A,N)
  46.     print("étape n°",t)
  47.     display(B)


 
Mais je comprend pas d'où vient le problème de type. Mais le problème vient de display(B). et j'ai l'erreur:

Code :
  1. if grid[i][j]==0:
  2. TypeError: 'int' object is not subscriptable


 
Pouvez-vous m'aider car je sait pas d'où sa peut venir.

Reply

Marsh Posté le 26-06-2013 à 21:29:12   

Reply

Marsh Posté le 26-06-2013 à 21:49:22    

Bonsoir,
je n'ai pas le temps de lire ton code mais le message d'erreur signifie que grid[i] contient un entier : grid[i][j] n'a donc pas de sens.
 


---------------
rule #1 : trust the python
Reply

Marsh Posté le 26-06-2013 à 22:01:59    

merci pour la réponse mais je vois pas pourquoi grid[i][j] n'a  pas de sens puisque c'est la coordonnée de ma grille.  
Mais le message d'erreur complet c'est :
Traceback (most recent call last):
 , line 56, in <module>
    display(B)
 , line 9, in display
    if grid[i]==0:
TypeError: 'int' object is not subscriptable

Reply

Marsh Posté le 27-06-2013 à 14:57:49    

Je me corrige : pour une raison ou pour une autre,

grid

contient un entier (et non une liste d'entiers, voire une liste de listes d'entiers vu ce que tu veux faire); Python ne peut donc accéder à

grid[i]

.


Message édité par suizokukan le 27-06-2013 à 14:58:36

---------------
rule #1 : trust the python
Reply

Marsh Posté le 27-06-2013 à 15:34:39    

merci pour ta réponse. j'ai reussit a corriger le problème:

Code :
  1. from random import randrange
  2. import random
  3. from copy import deepcopy
  4. def display(grid):
  5.     for i in range(N):
  6.         for j in range(N):
  7.             if grid[i][j]==0:
  8.                 print("*",end="" )
  9.             elif grid[i][j]==1:
  10.                 print(".",end="" )
  11.             else:
  12.                 print("#",end="" )
  13.         print()
  14. def init_state(N):
  15.     grid = [ [ randrange(3) for _ in range(0,N+1) ] for _ in range(0,N+1) ]
  16.    
  17.     if N%2 == 0:
  18.         grid[int(N/2)][int(N/2)] = 1
  19.     else:
  20.         grid[int(N/2 + 1)][int(N/2) + 1] = 1
  21.     return grid
  22. def next_grid(grid,N):
  23.     new_grid = deepcopy(grid)
  24.     for i in range(N):
  25.         for j in range(N):
  26.             if grid[i][j] == 2:
  27.                 count = 0
  28.                 if grid[i-1][j+1] == 0:
  29.                     count+=1
  30.                 if grid[i][j+1] == 0:
  31.                     count+=1
  32.                 if grid[i+1][j+1] == 0:
  33.                     count+=1
  34.                 if grid[i-1][j] == 0:
  35.                     count+=1
  36.                 if grid[i+1][j] == 0:
  37.                     count+=1
  38.                 if grid[i-1][j-1] == 0:
  39.                     count+=1
  40.                 if grid[i][j-1] == 0:
  41.                     count+=1
  42.                 if grid[i+1][j-1] == 0:
  43.                     count+=1
  44.                 if count == 2:
  45.                     new_grid[i][j] = 0
  46.                 else :
  47.                     new_grid[i][j] = 2
  48.            
  49.             elif grid[i][j] == 0:
  50.                 new_grid[i][j] = 1
  51.             elif grid[i][j] == 1:
  52.                 new_grid[i][j] = 2
  53.     grid[:] = new_grid
  54.     return new_grid
  55. #programme#
  56. N=11
  57. A=init_state(N)
  58. display(A)
  59. for t in range(1,6):
  60.     B= next_grid(A,N)
  61.     print("étape n°",t)
  62.     display(B)
  63.     A=B


 
Mais on m'a parler de limite aux bords mais je sais pas si mon code est bon car pour le lancer j'ai du modifier

Code :
  1. grid = [ [ randrange(3) for _ in range(0,N+1) ] for _ in range(0,N+1) ]

pour pouvoir le lancer. Est ce que la limite aux bords est bon car quand je regarde les résultat, sa me semble bon mais j'en suis pas sur.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed