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 lors de tirage au sort dans une liste


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Août 2019
    Messages : 10
    Par défaut Problème lors de tirage au sort dans une liste
    Travail sur Pycharm 2019.2 (64bit)

    Je débute en programmation et je souhaite réaliser un tirage de lettres pour un loto avec des enfants de maternelle.
    A chaque tour j'affiche la lettre choisie et supprime la lettre de la liste des lettres.
    Lorsque je lance dans le terminal (mis en gras dans le message) ça se passe bien au début et puis ce message d'erreur arrive après un certain nombre de tirages

    Il reste 19 tirages
    ['c', 'd', 'f', 'g', 'i', 'j', 'k', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y']
    La lettre choisie est d
    Appuyez sur une touche pour continuer...

    Il reste 18 tirages
    ['c', 'd', 'f', 'g', 'i', 'k', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y']
    La lettre choisie est f
    Appuyez sur une touche pour continuer...

    Traceback (most recent call last):
    File "C:/Users/Sebou/PycharmProjects/myfirstproject/lettres.py", line 17, in <module>
    print("La lettre choisie est " + (lettres[position]))
    IndexError: list index out of range

    Il reste 17 tirages
    ['c', 'f', 'g', 'i', 'k', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y']



    Programme

    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
    27
    # creer une liste qui va stocker des lettres pour simuler un loto
     
    lettres = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
               "w", "x", "y", "z"]
    varfin = 26
    running = True
    import random
    import os
     
    # boucle pour faire toutes les lettres
    while running:
     
        # tirage de la lettre
        position = random.randint(0, varfin)
        varfin = varfin - 1
        # affichage du tirage
        print("La lettre choisie est " + (lettres[position]))
        os.system("pause")
     
        # test de la boucle
        if varfin == 0:
            running = False
        else:
            # affichage du nombre de tirage restant
            print("Il reste " + str(varfin) + " tirages")
            print(lettres)
            del (lettres[position])


    D'avance merci

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Salut,

    print(position) avant l'instruction print("La lettre choisie est " + (lettres[position])) devrait vous mettre la puce à l'oreille.

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

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Août 2019
    Messages : 10
    Par défaut
    Du coup j'ai essayé votre conseil et effectivement j'ai vu le décalage de 1 entre la position de la lettre dans la liste et le tirage au sort.
    J'ai modifié dans les lignes 17 et 28 :
    lettres[position] en lettres[position-1]

    Merci

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Salut,

    Citation Envoyé par sebolix44 Voir le message
    J'ai modifié dans les lignes 17 et 28 :
    lettres[position] en lettres[position-1]
    La position du premier élément d'une liste étant 0, le 26ème élément aura pour position 25 et non 26... C'était varfin qu'il fallait initialiser autrement plutôt que de vous rattraper aux branches en bricolant avec position - 1.

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

  5. #5
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Août 2019
    Messages : 10
    Par défaut
    Merci beaucoup pour cette précision qui fait qu'effectivement le script est propre.(varfin=25 au départ)

    J'ai décalé en plus
    print(lettres) sous del (lettres[position]) pour plus de cohérence.

    Merci beaucoup !!

    Prochaine étape ajouter des objets....aux lettres

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 069
    Par défaut
    Bonsoir,

    C'est résolu, donc je me permet d'ajouter une autre solution...

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    In [1]: letters = ['c', 'd', 'f', 'g', 'i', 'j', 'k', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y']                                                                                             
     
    In [2]: from random import choice                                                                                                                                                                                  
     
     
    In [3]: while letters: 
       ...:     choice_computer = choice(letters) 
       ...:     print('la lettre choisie est {}'.format(choice_computer)) 
       ...:     letters.remove(choice_computer) 
       ...:     print('Il reste {} tirages'.format(len(letters))) 
       ...:                                                                                                                                                                                                            
    la lettre choisie est p
    Il reste 19 tirages
    la lettre choisie est x
    Il reste 18 tirages
    la lettre choisie est g
    Il reste 17 tirages
    la lettre choisie est o
    Il reste 16 tirages
    la lettre choisie est k
    Il reste 15 tirages
    la lettre choisie est c
    Il reste 14 tirages
    la lettre choisie est u
    Il reste 13 tirages
    la lettre choisie est w
    Il reste 12 tirages
    la lettre choisie est i
    Il reste 11 tirages
    la lettre choisie est d
    Il reste 10 tirages
    la lettre choisie est r
    Il reste 9 tirages
    la lettre choisie est q
    Il reste 8 tirages
    la lettre choisie est n
    Il reste 7 tirages
    la lettre choisie est s
    Il reste 6 tirages
    la lettre choisie est m
    Il reste 5 tirages
    la lettre choisie est j
    Il reste 4 tirages
    la lettre choisie est v
    Il reste 3 tirages
    la lettre choisie est f
    Il reste 2 tirages
    la lettre choisie est t
    Il reste 1 tirages
    la lettre choisie est y
    Il reste 0 tirages
    Ce qui est à retenir, c'est le choice(letters) qui est important à retenir et qui permet d'éviter le letters[randint(len(letters))]

    Bonne soirée...

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

Discussions similaires

  1. Optimiser un tirage au sort dans une collection
    Par sepas dans le forum Général Java
    Réponses: 5
    Dernier message: 11/07/2014, 17h47
  2. Problème de classement d'un champ dans une liste
    Par coolissimo777 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/11/2011, 12h39
  3. [AC-2007] Erreur lors de 'ajout de --tous-- dans une liste deroulante
    Par bernards111 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 13/12/2010, 11h20
  4. problème d'url et de recherche dans une liste
    Par kicoco dans le forum Développement Sharepoint
    Réponses: 2
    Dernier message: 15/06/2010, 14h06

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