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 :

Élément de liste inexistant alors qu'il existe [Python 3.X]


Sujet :

Python

  1. #1
    Membre du Club Avatar de Kassumaye
    Homme Profil pro
    Amateur
    Inscrit en
    Novembre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2017
    Messages : 7
    Par défaut Élément de liste inexistant alors qu'il existe
    Bonjour,

    Je débute en Python (et accessoirement en programmation). Je suis les exercice d'un livre et je dois faire un damier sur lesquels des pions viendront aléatoirement se poser. L'exercice a été réussit avec succès, seul bémol, parfois le programme me replaçait un pion sur un pion déjà existant ou peut etre le plaçait hors du canvas. Je voulais donc perfectionner le programme pour qu'il s'assure que le pion n'a pas déjà été crée.

    J'avoue que je ne savais pas comment m'y prendre mais j'ai créer une variable globale avec toutes les coordonnées possibles pour les pions, et j'ai demander a ma fonction pion() de vérifier que la coordonnée existe et si oui de la supprimer de la liste de versification après avoir tracé le pion.

    Le programme fonctionne, chaque clique sur le bouton me crée bien un nouveau pion mais l'interpréteur me retourne un message d'erreur et je ne comprends pas pourquoi. surtout qu'a l'usage le programme fait maintenant exactement ce que je veux, donc non seulement l'element de coordonnée de ma liste existe mais en plus il le supprime bien puisque je n'ai plus de cliques qui n'affichent pas de pions

    voici le mes

    voici le message d'erreur:
    Exception in Tkinter callback
    Traceback (most recent call last):
    File "C:\Users\***\Anaconda3\lib\tkinter\__init__.py", line 1699, in __call__
    return self.func(*args)
    File "C:/Programmation/Python/Cours/8.8 Damier.py", line 47, in pion
    w=verif.index(v)
    ValueError: [5, 8] is not in list


    et voici le code de la fonction:
    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
     
    def pion():
        "pose un pion aléatoirement sur le damier et ne peut créer deux fois le meme pion"
        global verif
     
        i=1
        while i:
            c,l=randint(1,8),randint(1,8)
            v=[c,l]
            if v in verif:
                i=0
     
        while verif:
            x,y=c*50-25,l*50-25
            cercle(x,y,20)
            w=verif.index(v)
            del(verif[w])
    Si une $ame charitable pouvais éclairer ma lanterne ...

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    et verif c'est définit ou et comment ?

  3. #3
    Membre du Club Avatar de Kassumaye
    Homme Profil pro
    Amateur
    Inscrit en
    Novembre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2017
    Messages : 7
    Par défaut
    verif est définie au lancement du programme, la liste est crée par une boucle while qui l'a crée automatiquement. j'ai vérifié avec un print() (que j'ai effacé ensuite, la liste contient exactement les paires de coordonnées dont j'ai besoin.

    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
     
    # --- Programme Principal ---
     
    # Création automatique de la liste de verification pour les pions
    verif=[]
    i,x,y=1,0,1
    while i<65:
        x+=1
        verif.append([x,y])
        if i%8==0:
            y+=1
            x=0
        i+=1
     
    # Création du widget principal ("maître") :
    fen1 = Tk()

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 695
    Par défaut
    Salut,

    Relisez votre code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        while verif:
            x,y=c*50-25,l*50-25
            cercle(x,y,20)
            w=verif.index(v)
            del(verif[w])
    Si [5, 8] était dans verif à la première itération, il n'y sera plus à la seconde.
    Et donc votre code ne fonctionne que si "verif" ne contient que des [5, 8] (on en détruit un à chaque itération jusqu'à ce que la liste soit vide) et plantera s'il contient des [5, 8] et autre chose.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre du Club Avatar de Kassumaye
    Homme Profil pro
    Amateur
    Inscrit en
    Novembre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2017
    Messages : 7
    Par défaut
    Salut,

    non le code ne plante pas. sur mon damier de 64 cases je peux placer 64 pions aux 64 coordonnées définies dans la liste ([1,1],[2,1],...,[7,8],[8,8]). lorsque j'ai fait la liste j'ai vérifié qu'elle était bien ce que je voulais en l’affichant avec un print. Ma seule erreur dans le fonctionnement du programme est d'avoir oublier au moment de la verification de mettre while i and verif: ... ce qui faisait tourner la boucle en infinie au 65ème clique sur le bouton pion.

    Ce que je déduis de mes tests et de cet oublie, c'est que les coordonnées existent dans la liste, sont enlevée chaque fois qu'elles ont été piochée, et qu'après avoir posé un pion sur chacune des 64 cases la liste est bien vide (vu que la boucle tournait a l'infinie)

    Et en écrivant tout ça ça vient de faire tilt dans ma tête, oh magie !
    j'utilise un while mais c'est un if que je devrais utilisé dans cette expression. En fait tu as raison, la boucle est bien lue une fois puis recommence et m'indique l'erreur, d'ou le fait que le programme fonctionne vu qu'il lui suffit de lire l'instruction qu'une fois. Je cherchais juste pas au bon endroit.

    Merci pour la lumière.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 695
    Par défaut
    Citation Envoyé par Kassumaye Voir le message
    En fait tu as raison, la boucle est bien lue une fois puis recommence et m'indique l'erreur, d'ou le fait que le programme fonctionne vu qu'il lui suffit de lire l'instruction qu'une fois. Je cherchais juste pas au bon endroit.
    Relisez encore votre code initial.
    Tout ces instructions là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        i=1
        while i:
            c,l=randint(1,8),randint(1,8)
            v=[c,l]
            if v in verif:
                i=0
    se contentent de piocher un élément au hasard dans "verif".

    Bon déjà la variable "i" ne sert à rien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        while True:
            c,l=randint(1,8),randint(1,8)
            v=[c,l]
            if v in verif:
                break
    La boucle "while" ne sert pas non plus à grand chose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        if verif:
                      ix = randint(0, len(verif))
                      l, c = v = verif[ix]
                      ....
    Si vous essayiez de faire plus simple, vous auriez moins de lignes bizarres à relire et votre code serait plus facile à comprendre et à mettre au point.
    note: et je n'ai utilisé que des fonctionnalités que vous devez connaître. random.choice existe aussi pour ce cas, mais il faut avoir le réflexe d'ouvrir la documentation.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre du Club Avatar de Kassumaye
    Homme Profil pro
    Amateur
    Inscrit en
    Novembre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2017
    Messages : 7
    Par défaut
    Salut,

    merci pour toutes ces explications. Je n'ai pas encore vu le break dans le cours que je suis.

    Quand à la doc je l'ai lue, je savais qu'un module random existait car j'avais vu la fonction randrange, ça ne correspondait pas a ce que je voulais car a ce moment la je voulais que c et l prennent des valeurs entre 1 et 8 et vérifier que cette valeur existe encore dans la liste, sinon en trouver d'autres pour que ça corresponde a une valeur existante... ce qui revient a piocher une valeur dans la liste effectivement. Encore faut il le voir de ce point de vue. Quand on débute on se trouve devant un problème on se dit comment je vais le résoudre et on trouve une solution avec ce qu'on connait, avec les idées qui nous viennent dans l'esprit.

    Je me lance dans la programmation car j'aime apprendre des choses dans mes centres d’intérêts, cependant la programmation est très loin de mon domaine professionnel, je suis bûcheron. Quand j'ai passé mon diplôme, on avait dans notre groupe un ingénieur en nucléaire en reconversion. Malgré qu'il était surement le gars le plus diplômé de la formation c'était aussi le plus mauvais et il coinçait régulièrement la tronçonneuse dans l'arbre alors que ça aurait du etre facile pour lui a comprendre, c'est juste une question de loi de gravité et de force. A coté de ça il y avait des gars qui n'avait aucun diplômes et qui étaient super performant, mais fils d'agriculteurs ils avaient une maîtrise de la nature et peut etre aucune connaissance des principes de gravité, force, torseurs ... Ce que je veux dire par là c'est que je m'excuse si mon raisonnement peut sembler stupide (et une fois que tu pointe la chose je me rends compte que c'est stupide, créer une valeur pour vérifier qu'elle existe dans une liste au lieu de la piocher directement dans la liste !) mais parfois il nous faut apprendre les automatisme d'un nouveau domaine de compétence, passer outre sa joie d'avoir trouvé une solution (bancale) alors qu'une autre solution (optimale) existait et qu'elle était peut être plus simple a trouver une fois qu'on la connait....
    Si j'explique tout ça c'est parce que le milieu de la programmation a l'air parfois très méprisant face aux erreurs des débutants (je ne dis pas que c'est ton cas). J'ai d'ailleurs longtemps éviter de posé me questions dans des forums au vu des réponses que j'ai pu lire en faisant des recherches sur google. D'ailleurs tu remarqueras que ma première question sur un forum c'est a propos d'un code qui marchait (a moitié vu qu'il me renvoyait quand même une erreur mais que le programme faisait ce que je voulais qu'il fasse) car je voulais surtout pas qu'on me dise t'as pas cherché. Bon après c'est pas grave, la prochaine fois je lirais la doc et essayerai de comprendre qu'une fonction qui me semble pas adaptée a mon problème l'est surement plus que celle que j'ai choisie dans cette même doc.

    Quoiqu'il en soit je te remercie de ta réponse car j'ai appris qu'il existe une fonction break, qu'il est possible de mettre tous les éléments d'une liste dans des variables en une seule ligne sans indiquer l'index et j'ai même encore simplifier mon code vu qu'il y avait des redondances dans la deuxième partie de ma fonction.

    de ç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
    def pion():
        "pose un pion aléatoirement sur le damier et ne peut créer deux fois le meme pion"
        global verif
     
        i=1
        while i:
            c,l=randint(1,8),randint(1,8)
            v=[c,l]
            if v in verif:
                i=0
     
        while verif:
            x,y=c*50-25,l*50-25
            cercle(x,y,20)
            w=verif.index(v)
            del(verif[w])
    je suis passé à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def pion():
        "pose un pion aléatoirement sur le damier et ne peut créer deux fois le meme pion"
        global verif
     
        if verif:
           ix=randint(0,len(verif))
           c,l=verif[ix]
     
        if verif:
            x,y=c*50-25,l*50-25
            cercle(x,y,20)
            del(verif[ix])
    Ce qui est quand même plus joli a lire et plus propre.

    Cependant une question en appelant une autre j'en ai deux à l'esprit:

    1/ de manière aléatoire avec ton code l'interpréteur me renvoie une erreur :
    File "C:/Programmation/Python/Cours/8.8 Damier.py", line 39, in pion
    c,l=verif[ix]
    IndexError: list index out of range


    Z/ avec la fonction choice je ne vois pas comment récupérer l'index de l'élément choisit directement. La seule chose que je suis capable de faire est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ch=choice(verif)
    c,l=ch
    ix=verif.index(ch)
    du coup c'est trois lignes au lieu de deux, est ce moins optimisé?
    Cependant aucun doute que c'est la fonction qu'il me fallait car je n'ai plus aucun message d'erreur lors de l’exécution du programme.

    et comme écrire ce pavé me pousse a faire des tests je viens de tester cette modif car je me suis dit que maintenant que j'avais ma coordonnée je pouvais peut être l'effacée directement sans connaitre son index vu que chaque valeur de la liste est unique et j'ai trouvé remove que je n'avais jamais utilisé. du coup je me suis autorépondu à la question 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def pion():
        "pose un pion aléatoirement sur le damier et ne peut créer deux fois le meme pion"
        global verif
     
        if verif:
            ch=choice(verif)
            c,l=ch
     
        if verif:
            x,y=c*50-25,l*50-25
            cercle(x,y,20)
            verif.remove(ch)
    Tu vois ça commence à rentrer

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 695
    Par défaut
    Salut,

    Citation Envoyé par Kassumaye Voir le message
    1/ de manière aléatoire avec ton code l'interpréteur me renvoie une erreur :
    File "C:/Programmation/Python/Cours/8.8 Damier.py", line 39, in pion
    c,l=verif[ix]
    IndexError: list index out of range
    çà c'est parce que j'ai oublié de relire la documentation concernant randint. Cette fonction là inclue la deuxième borne. Donc de temps en temps la valeur len(verif) va sortir... avec l'IndexError qui va avec.
    Il faut utiliser randrange ou soustraire 1 à len.
    Désolé.

    Lorsqu'on débute, il faut arriver à faire fonctionner le code peut importe comment il a été écrit: l'important est de trouver une stratégie, d'arriver à imaginer comment la machine fonctionne.

    Pour progresser, l'informatique n'existe pas dans la nature, c'est très codifié et il faut prendre le temps de lire les tutos, la documentation et les codes écrits par d'autres.

    J'ai deux tronçonneuses dans mon garage. Je les utilise plutôt en hiver.
    Pas facile de comparer un boulot où on est vite rappelé à l'ordre par les réalités physiques et l'univers d'abstractions auquel la programmation donne accès. Mais pour les deux, il faut de la motivation pour apprendre et trouver ses limites (i.e. quand faire appel à un pro. plutôt que de se mettre en danger).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Fichier ressource dit inexistant alors qu'il existe | Localisation
    Par coelti dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 16/04/2017, 22h56
  2. Réponses: 1
    Dernier message: 19/10/2006, 15h33
  3. Ajout nouveaux éléments dans liste de choix
    Par Crazyblinkgirl dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 23/06/2006, 15h17
  4. Suppression élément dans liste
    Par bugmenot dans le forum C
    Réponses: 12
    Dernier message: 06/12/2005, 19h52
  5. [Xul] l'élément tree: liste récursive et RDF
    Par TNorth dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 30/08/2005, 17h36

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