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 :

Problème avec des listes


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2014
    Messages : 19
    Points : 17
    Points
    17
    Par défaut Problème avec des listes
    Bonjour,

    voilà, je réalise un petit programme Mastermind. Dans ma fonction de vérification je rencontre quelques difficultés.
    Je n'arrive pas à comprendre une de mes erreurs.
    Voici le code de la fonction en question :

    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
    def vérification(propo,combi):  # vérification de la proposition
        """fonction permettant de vérifier la proposition du joueur"""
        BP=0
        MP=0
        combi2=combi[:]
        propo2=propo[:]
        for position,lettre in enumerate(propo2):
            for p,c in enumerate(combi2):
                if c==lettre:
                    combi2.remove(c)
                    if p==position:
                        BP+=1
                    else:
                        MP+=1
                else:
                    propo2.remove(lettre)
     
        return BP,MP
    Pourquoi Python me dit que lettre ne se trouve pas dans la liste propo2 ? Je trouve cela étrange puisque lettre est une variable décrivant les éléments de la liste en question...

    Merci !

  2. #2
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Pas de souci chez moi.

    Par contre : à éviter, les noms de fonctions, variables, ... avec des accents !
    Pas d'aide par mp.

  3. #3
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Je pense que marco056 a dut essayer avec deux listes particulières parce que le code doit normalement se planter.

    Il ne faut jamais modifier la longueur d'un itérable pendant une itération.

    Supprime tes deux remove() et ça fonctionnera.

  4. #4
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Non, non, le programme plante effectivement mais pas de souci pour les variables de boucle.
    Sinon, oui, évidemment, comme des éléments disparaissent en cours de boucle, cela ne peut fonctionner...
    Pas d'aide par mp.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2014
    Messages : 19
    Points : 17
    Points
    17
    Par défaut Marche toujours pas
    Bon... J'ai un peu modifié le code. Cela marche mieux mais cela ne fait toujours pas ce que je veux apparemment.
    J'aimerais que la fonction me retourne le nombre de lettres à la bonne place et le nombre de lettres à la mauvaise position. (principe du Mastermind)
    J'ai fait ç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
    def verification(propo,combi):  # vérification de la proposition
        """fonction permettant de vérifier la proposition du joueur"""
        BP=0
        MP=0   
        for position,lettre in enumerate(propo):
            if lettre in combi:
                #print(" ",lettre, " est dans combi")
                if lettre==combi[position]:
                    BP+=1
                    #print("Et à la bonne place")
                else:
                    MP+=1
                    #print("mais à la mauvaise place")
            else:
                print("")
                #print(" ",lettre, "n'est pas dans combi")   
        return BP,MP

  6. #6
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Où est le problème ?

    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
     
    # -*- coding: utf-8 -*-
     
    def verification(propo,combi):
        """fonction permettant de vérifier la proposition du joueur"""
        BP=0
        MP=0   
        for position,lettre in enumerate(propo):
            if lettre in combi:
                if lettre==combi[position]:
                    BP+=1
     
                else:
                    MP+=1
     
        return MP, BP
     
    secret = list("hgtjki")
    props = ["jlkion", "ghmpov", "hsgjai", "fhgtik"]
     
    for prop in props:
        prop = list(prop)
        print(secret)
        print(prop)
        print("%s bonnes lettres, %s bien placées" % verification(prop, secret))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ['h', 'g', 't', 'j', 'k', 'i']
    ['j', 'l', 'k', 'i', 'o', 'n']
    3 bonnes lettres, 0 bien placées
    ['h', 'g', 't', 'j', 'k', 'i']
    ['g', 'h', 'm', 'p', 'o', 'v']
    2 bonnes lettres, 0 bien placées
    ['h', 'g', 't', 'j', 'k', 'i']
    ['h', 's', 'g', 'j', 'a', 'i']
    1 bonnes lettres, 3 bien placées
    ['h', 'g', 't', 'j', 'k', 'i']
    ['f', 'h', 'g', 't', 'i', 'k']
    5 bonnes lettres, 0 bien placées
    C'est bon, non ?

  7. #7
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2014
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    Non, parce pour une combinaison : AADD
    Si je propose AAAA je devrais avoir BP = 2 et MP= 0
    Alors que j'ai MP= 2 avec mon algo.
    Une lettre, de la combinaison ne peut être considérée que pour un seul incrément on va dire...

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par entropie67 Voir le message
    Non, parce pour une combinaison : AADD
    Si je propose AAAA je devrais avoir BP = 2 et MP= 0
    Alors que j'ai MP= 2 avec mon algo.
    Les "A" en position 3 et 4 sont effectivement "mal placés".
    Comment formuleriez vous la chose (en français) pour que MP soit 0 dans ce cas?

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

  9. #9
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2014
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    Comme dans les règles du Mastermind.
    Il y a toujours cette ambiguïté. Mais sinon le jeu devient impossible.
    On doit donner l'information en partant de la combinaison :
    AADD
    Le A est bien placé.
    Le A est mal placé.
    Le D est absent.
    Le D est absent.

    Ce qui donne : bien placée : 1 Mal placée : 1 (absentes : 2)

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Hu? Ca n'aide pas pour écrire une condition "programmable".
    Est ce qu'on pourrait dire qu'une lettre est "mal placée" lorsqu'il n'existe pas d’occurrence "bien placée" par ailleurs?
    Si tel est le cas, ça devient plus compliqué et difficile de ne pas faire en 2 étapes i.e.
    • fabriquer une liste de bien placés,
    • calculer les mal placés

    un truc comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       for position,lettre in enumerate(propo):
            if lettre in combi:
                if lettre!=combi[position] and lettre non in bien_places:
                    MP+=1
    devrait le faire.

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

  11. #11
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2014
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    De mon côté je viens de trouver :
    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
    def verification(propo,combi):  # vérification de la proposition
        """fonction permettant de vérifier la proposition du joueur"""
        BP=0
        MP=0
        combi2=combi[:]
        for position,lettre in enumerate(propo):
            if lettre in combi2:
                #print(" ",lettre, " est dans combi")
                if lettre==combi2[position]:
                    BP+=1
                    combi2[position]='*'
                    #print("Et à la bonne place")
        #print(combi2)
        for position,lettre in enumerate(propo):
            if lettre in combi2:
                    MP+=1
                    combi2.remove(lettre)
                    #print("mais à la mauvaise place")
            #print(combi2)
        #print(combi2)
        #print(combi)
     
        return BP,MP
    Ca marche. Mais à mon avis ce n'est pas tellement optimisé

    Merci W, je vais regarder ta proposition !

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par entropie67 Voir le message
    Merci W, je vais regarder ta proposition !
    A priori, il faut ajouter du code car si on compare AADDA avec AAAAA, on devrait trouver bp = 2 et mp = 1.

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

Discussions similaires

  1. problème avec des listes
    Par alice.br dans le forum Général Python
    Réponses: 7
    Dernier message: 22/11/2014, 18h03
  2. Problème avec des listes déroulantes liées
    Par guitsch dans le forum GTK+ avec C & C++
    Réponses: 9
    Dernier message: 22/10/2008, 16h07
  3. Problème de rendu avec des listes
    Par Erwane dans le forum Scheme
    Réponses: 19
    Dernier message: 03/03/2008, 21h27
  4. Problème avec des listes et des variables
    Par Knuckles dans le forum Général Python
    Réponses: 3
    Dernier message: 09/05/2006, 18h24
  5. Problèmes avec des cases à cocher et une liste déroulante
    Par rob2-9 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 25/01/2006, 10h52

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