IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Boucle while & IndexError


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 5
    Par défaut Boucle while & IndexError
    Bonjour, j'ai une liste de listes représentant un plateau de 16*16
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plateau = [[0 for x in range (16)] for y in range(16)]
    Chaque entier dans les listes (des 0 de base) représentent donc une case.
    J'ai besoin d'une fonction qui fait que par exemple, si il y a un ou plusieurs 2 dans la liste, qu'ils s'étendent aux 4 cases adjacents (remplaçant les 0 par des 2)
    J'ai la base du code pour étendre les 2 qui fonctionne bien, mais cependant j'ai besoin de stocker avant de commencer les coordonnées des 2 qu'on trouve dans le plateau, pour ensuite étendre seulement sur ces coordonnées. (sinon j'ai une boucle qui le fait jusqu'à temps que tout le plateau soit rempli de 2, ou alors juste sur le premier 2 qu'il trouve)
    J'ai donc essayé quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    def avancement(plateau):
        cases_j_x=[]
        cases_j_y=[]
        for row_num in range(16):
            row=plateau[row_num]
            for column in range(16):
                if row[column] == 2 or row[column] == 3:
                    cases_j_x.append(row_num)
                    cases_j_y.append(column)
                    index_j=0
                    j_x=cases_j_x[index_j]
                    j_y=cases_j_y[index_j]
                    while index_j <= len(cases_j_x):
                        if j_y-1 >= 0 and plateau[j_x][j_y-1]==0 or plateau[j_x][j_y-1]==6 or plateau[j_x][j_y-1]==7:
                            plateau[j_x][j_y-1]=2
                        if j_y+1 < 16 and plateau[j_x][j_y+1]==0 or plateau[j_x][j_y+1]==6 or plateau[j_x][j_y+1]==7:
                            plateau[j_x][j_y+1]=2
                        if j_x-1 >= 0 and plateau[j_x-1][j_y]==0 or plateau[j_x-1][j_y]==6 or plateau[j_x-1][j_y]==7:
                            plateau[j_x-1][j_y]=2
                        if j_x+1 < 16 and plateau[j_x+1][j_y]==0 or plateau[j_x+1][j_y]==6 or plateau[j_x+1][j_y]==7:
                            plateau[j_x+1][j_y]=2
                        index_j+=1
                        j_x=cases_j_x[index_j]
                        j_y=cases_j_y[index_j]
     
                    return plateau
    Au début tout va bien, cela stock les différentes coordonnées dans 2 listes (x et y)
    J'ai ensuite une variable initialisé à 0 et 2 autres (pour x et y) qui prendront successivement les valeurs des coordonnées dans la liste, à chaque fois appliquant l'extension avant de prendre la valeur suivante.
    Or quand j'éxécute le programme je tombe sur une IndexError, parce que la variable qui me sert d'index n'est plus dans la range des listes, comme si la boule ne s'arrêtait jamais alors qu'elle devrait s'arrêter justement quand c'est le cas.
    J'ai essayé des choses avec la commande break, sans grand succès.
    Je sais pas si je suis très clair, mais merci à ceux qui pourront m'aider

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 5
    Par défaut
    En modifiant comme ceci, il n'y a pas d'erreur mais ça fonctionne seulement pour le premier 2 trouvé dans la liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    def avancement(plateau):
        cases_j_x=[]
        cases_j_y=[]
        for row_num in range(16):
            row=plateau[row_num]
            for column in range(16):
                if row[column] == 2 or row[column] == 3:
                    cases_j_x.append(row_num)
                    cases_j_y.append(column)
                    index_j=0
                    while index_j in range(len(cases_j_x)):
                        j_x=cases_j_x[index_j]
                        j_y=cases_j_y[index_j]
                        if j_y-1 >= 0 and plateau[j_x][j_y-1]==0 or plateau[j_x][j_y-1]==6 or plateau[j_x][j_y-1]==7:
                            plateau[j_x][j_y-1]=2
                        if j_y+1 < 16 and plateau[j_x][j_y+1]==0 or plateau[j_x][j_y+1]==6 or plateau[j_x][j_y+1]==7:
                            plateau[j_x][j_y+1]=2
                        if j_x-1 >= 0 and plateau[j_x-1][j_y]==0 or plateau[j_x-1][j_y]==6 or plateau[j_x-1][j_y]==7:
                            plateau[j_x-1][j_y]=2
                        if j_x+1 < 16 and plateau[j_x+1][j_y]==0 or plateau[j_x+1][j_y]==6 or plateau[j_x+1][j_y]==7:
                            plateau[j_x+1][j_y]=2
                        index_j=index_j+1
     
     
                    return plateau

  3. #3
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Salut.

    Pour ma part, je n'ai rien compris.

    Si tu as besoin de récuperer, les index de la position des valeurs à 2 dans ton tableau, il suffit de les stocker dans une liste de tuples.
    Et partant de ces coordonnées, il est simple de trouver les index des éléments qui sont contigus à ces éléments, en faisant juste gaffe de ne pas dépasser les bornes du tableau, surtout en python avec les index négatifs.

    Je ne comprends pas non plus pourquoi tu fais un return de ton plateau, cela doit être en partie lié à ton problème qui fait que seulement un élément est changé, pas besoin de retourner quoique ce soit puisque tu travailles sur un mutable.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 5
    Par défaut
    Merci de ta réponse
    Pour le return, ça ne marche pas sans, ça me donne une autre IndexError.
    Pour le stockage des coordonnées tout marche bien, le problème c'est la boucle while, censée étendre chacune des cases stockées précédemment, je n'arrive pas à la faire fonctionner correctement

  5. #5
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Et donc parce que tu as un indexError, tu l'ignores en faisant un return au lieu d'essayer de comprendre pourquoi tu as cette erreur ?

    T'es pas dans la panade

    Sinon, ce que tu devrais déjà faire, c'est une fonction qui te retourne les coordonnées des éléments contigus à telle coordonnée de ton tableau.

    Quand on bloque sur un problème, on le décompose en étapes simples.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 5
    Par défaut
    Si je viens ici c'est parce que justement je l'ai pas comprise, c'est dans le titre en fait.
    Je vais essayer, merci

  7. #7
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Pour te simplifier la vie utilise un deuxième tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    >>> plateau = [[0,0,0,2,0],[2,0,0,2,0],[0,2,0,0,0],[0,0,0,0,2],[0,0,0,0,0]]
    >>> plateau1 = [[0 for i in range(5)] for j in range(5)]
    >>> for i in range(5):
    ...     for j in range(5):
    ...             if plateau[i][j] == 2:
    ...                     plateau1[i][j] = 2
    ...                     if i > 0:
    ...                             plateau1[i-1][j] = 2
    ...                     if i < 4:
    ...                             plateau1[i+1][j] = 2
    ...                     if j > 0:
    ...                             plateau1[i][j-1] = 2
    ...                     if j < 4:
    ...                             plateau1[i][j+1] = 2
    ... 
    >>> plateau
    [[0, 0, 0, 2, 0], [2, 0, 0, 2, 0], [0, 2, 0, 0, 0], [0, 0, 0, 0, 2], [0, 0, 0, 0, 0]]
    >>> plateau1
    [[2, 0, 2, 2, 2], [2, 2, 2, 2, 2], [2, 2, 2, 2, 2], [0, 2, 0, 2, 2], [0, 0, 0, 0, 2]]
    après il te suffit de renommer plateau1 en plateau.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 5
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,

    Pour te simplifier la vie utilise un deuxième tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    >>> plateau = [[0,0,0,2,0],[2,0,0,2,0],[0,2,0,0,0],[0,0,0,0,2],[0,0,0,0,0]]
    >>> plateau1 = [[0 for i in range(5)] for j in range(5)]
    >>> for i in range(5):
    ...     for j in range(5):
    ...             if plateau[i][j] == 2:
    ...                     plateau1[i][j] = 2
    ...                     if i > 0:
    ...                             plateau1[i-1][j] = 2
    ...                     if i < 4:
    ...                             plateau1[i+1][j] = 2
    ...                     if j > 0:
    ...                             plateau1[i][j-1] = 2
    ...                     if j < 4:
    ...                             plateau1[i][j+1] = 2
    ... 
    >>> plateau
    [[0, 0, 0, 2, 0], [2, 0, 0, 2, 0], [0, 2, 0, 0, 0], [0, 0, 0, 0, 2], [0, 0, 0, 0, 0]]
    >>> plateau1
    [[2, 0, 2, 2, 2], [2, 2, 2, 2, 2], [2, 2, 2, 2, 2], [0, 2, 0, 2, 2], [0, 0, 0, 0, 2]]
    après il te suffit de renommer plateau1 en plateau.
    Ça parait effectivement plus simple et logique mais je n'y avais pas pensé !
    Merci beaucoup, je vais faire comme ça

Discussions similaires

  1. boucle while trop lente
    Par atouze dans le forum Access
    Réponses: 17
    Dernier message: 15/06/2005, 16h35
  2. Boucle while & read
    Par gibet_b dans le forum Linux
    Réponses: 4
    Dernier message: 29/04/2005, 15h38
  3. boucle while et post incrémentation
    Par tut dans le forum C++
    Réponses: 7
    Dernier message: 10/12/2004, 17h24
  4. [MFC] Dialog dans une boucle while
    Par oxor3 dans le forum MFC
    Réponses: 5
    Dernier message: 23/04/2004, 22h51
  5. [débutant]Documentation? boucle "while"? Session?
    Par o151181 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 19/01/2004, 15h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo