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 infinie/Éléments qui ne se suppriment pas ? [Problème débutant]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 6
    Par défaut Boucle infinie/Éléments qui ne se suppriment pas ? [Problème débutant]
    Bonjour, j'ai un petit problème avec mon programme que voici:

    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
    52
    53
    import copy
    import random
    def DistributionPar3(l):
    ****a=[]
    ****b=[]
    ****c=[]
    ****d=[]
    ****e=[]
    ****m=[]
    ****i=0
    ****o=copy.deepcopy(l)
    ****n=len(o)
    ****while n>=1:
    ********w=random.choice(o)
    ********e.append(w)
    ********del w
    ********k=random.choice(o)
    ********a.append(k)
    ********del k
    ********k=random.choice(o)
    ********a.append(k)
    ********del k
    ********k=random.choice(o)
    ********a.append(k)
    ********del k
    ********x=random.choice(o)
    ********b.append(x)
    ********del x
    ********x=random.choice(o)
    ********b.append(x)
    ********del x
    ********x=random.choice(o)
    ********b.append(x)
    ********del x
    ********y=random.choice(o)
    ********c.append(y)
    ********del y
    ********y=random.choice(o)
    ********c.append(y)
    ********del y
    ********y=random.choice(o)
    ********c.append(y)
    ********del y
    ********z=random.choice(o)
    ********d.append(z)
    ********del z
    ********z=random.choice(o)
    ********d.append(z)
    ********del z
    ********z=random.choice(o)
    ********d.append(z)
    ********del z
    ****print("[{} pour le joueur 1,{} pour le joueur 2,{} pour le joueur 3,{} pour le joueur 4],[{} pour le Chien]".format(a,b,c,d,e))
    En gros, "l" est un jeu de 78 cartes et je dois en distribuer 18 à chaque joueur et 6 au 5ème joueur.
    Les joueurs 1,2,3 et 4 sont représentés par les listes a,b,c et d et le 5ème joueur est représenté par la liste e.
    Pour distribuer les cartes, je dois distribuer les cartes 3 par 3 (pour les 4 premiers joueurs) et 1 par 1 (pour le 5ème joueur) et répéter cette opération jusqu’à ce que toutes les cartes aient été distribuées (donc je devrais faire six distributions 3 par 3)

    Cependant, j'ai un problème avec ma boucle (le "while n>=1") en effet, quand j'exécute le programme, elle est infinie et ne s'arrête jamais.
    J'ai essayé le programme sans cette boucle et avec un "print(n)" à la fin et j'avais bien 3 cartes distribuées aux 4 premiers joueurs, une carte distribuée au joueur 5 mais la valeur de n renvoyée était de 78. Donc, les cartes distribuées n'ont pas été supprimées de la liste.

    Quelqu'un saurait-il comment résoudre ce problème ?
    Et y a t-il un moyen de distribuer les cartes 3 par 3 sans copier trois fois de suite les mêmes lignes de code?
    Merci beaucoup !

  2. #2
    Membre averti
    Homme Profil pro
    Dessinateur projeteur
    Inscrit en
    Octobre 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur projeteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2015
    Messages : 22
    Par défaut
    salut, tu pourrais indenter ton code stp ?

    sinon pour supprimer des éléments d'une liste tu peux utiliser un ".remove()"

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 6
    Par défaut
    Salut,
    toutes mes excuses, j'ai édité le post initial.
    Je vais essayer avec le remove, merci!

  4. #4
    Membre averti
    Homme Profil pro
    Dessinateur projeteur
    Inscrit en
    Octobre 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur projeteur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Octobre 2015
    Messages : 22
    Par défaut
    ok sans être certain,, je pense qu'il faut que tu mette a la place de "del w" ect... un "o.remove(w)" ect...

  5. #5
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Citation Envoyé par Rekkles Voir le message
    Bonjour, j'ai un petit problème avec mon programme que voici:

    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
    52
    53
    import copy
    import random
    def DistributionPar3(l):
        a=[]
        b=[]
        c=[]
        d=[]
        e=[]
        m=[]
        i=0
        o=copy.deepcopy(l)
        n=len(o)
        while n>=1:
            w=random.choice(o)
            e.append(w)
            del w
            k=random.choice(o)
            a.append(k)  
            del k
            k=random.choice(o)
            a.append(k)  
            del k
            k=random.choice(o)
            a.append(k)  
            del k
            x=random.choice(o)
            b.append(x)
            del x
            x=random.choice(o)
            b.append(x)
            del x
            x=random.choice(o)
            b.append(x)
            del x
            y=random.choice(o)
            c.append(y)  
            del y
            y=random.choice(o)
            c.append(y)  
            del y
            y=random.choice(o)
            c.append(y)  
            del y
            z=random.choice(o)
            d.append(z)
            del z
            z=random.choice(o)
            d.append(z)
            del z
            z=random.choice(o)
            d.append(z)
            del z
        print("[{} pour le joueur 1,{} pour le joueur 2,{} pour le joueur 3,{} pour le joueur 4],[{} pour le Chien]".format(a,b,c,d,e))
    En gros, "l" est un jeu de 78 cartes et je dois en distribuer 18 à chaque joueur et 6 au 5ème joueur.
    Les joueurs 1,2,3 et 4 sont représentés par les listes a,b,c et d et le 5ème joueur est représenté par la liste e.
    Pour distribuer les cartes, je dois distribuer les cartes 3 par 3 (pour les 4 premiers joueurs) et 1 par 1 (pour le 5ème joueur) et répéter cette opération jusqu’à ce que toutes les cartes aient été distribuées (donc je devrais faire six distributions 3 par 3)

    Cependant, j'ai un problème avec ma boucle (le "while n>=1") en effet, quand j'exécute le programme, elle est infinie et ne s'arrête jamais.
    J'ai essayé le programme sans cette boucle et avec un "print(n)" à la fin et j'avais bien 3 cartes distribuées aux 4 premiers joueurs, une carte distribuée au joueur 5 mais la valeur de n renvoyée était de 78. Donc, les cartes distribuées n'ont pas été supprimées de la liste.

    Quelqu'un saurait-il comment résoudre ce problème ?
    Et y a t-il un moyen de distribuer les cartes 3 par 3 sans copier trois fois de suite les mêmes lignes de code?
    Merci beaucoup !
    Bonsoir,
    Il n'y a pas besoin de boucles. Ici, modifier la liste aléatoirement ne peut qu'engendrer des problèmes.
    La solution serait de mélanger la liste avant la distribution programmée.
    Dans ce cas, la méthode "suffle" appliquée à la liste va la "mélanger".
    Ensuite, tout à loisir, distribuer les cartes. (D'ailleurs, la partition immédiate est alors totalement comparable: au lieu de faire plusieurs tours, distribuer à chacun sa main en une seule fois).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> import random
    >>> lst = [x for x in range(10)]
    >>> lst
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> random.shuffle(lst)
    >>> lst
    [4, 6, 3, 2, 0, 1, 5, 9, 8, 7]
    >>>
    Clodion

    PS: cela boucle car la variable "n" n'est jamais mise à jour dans la boucle. Il serait plus judicieux d'écrire "while len(o)>=1:"
    Attention aux noms des variables! (l et o sont à proscrire).

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 6
    Par défaut
    Bonsoir,
    la commande o.remove() n'a rien changé

    Pour la modification aléatoire, en réalité, seules les cartes du 5ème joueur doivent être choisies aléatoirement.
    Pour les cartes des 4 premiers joueurs, elles peuvent être choisies en fonction des cartes disponibles.
    J'avais fait une opération qui ajoutait l[0] à chaque liste des 4 1ers joueurs jusqu'à ce que chaque liste possède 3 cartes mais encore une fois, impossible de supprimer des termes de l...

    Par contre, je dois distribuer les cartes 3 par 3 et non 18 par 18 car c'est la consigne, d'où l'utilité d'une boucle.
    Je prends en note pour le dernier point, merci .

  7. #7
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Citation Envoyé par Rekkles Voir le message
    Bonsoir,
    la commande o.remove() n'a rien changé

    Pour la modification aléatoire, en réalité, seules les cartes du 5ème joueur doivent être choisies aléatoirement.
    Pour les cartes des 4 premiers joueurs, elles peuvent être choisies en fonction des cartes disponibles.
    J'avais fait une opération qui ajoutait l[0] à chaque liste des 4 1ers joueurs jusqu'à ce que chaque liste possède 3 cartes mais encore une fois, impossible de supprimer des termes de l...

    Par contre, je dois distribuer les cartes 3 par 3 et non 18 par 18 car c'est la consigne, d'où l'utilité d'une boucle.
    Je prends en note pour le dernier point, merci .
    Bonsoir,
    C'est la différence entre une distribution réelle et une distribution aléatoire virtuelle. Dans le tarot, il y a toujours des suites de cartes qui se retrouvent dans le groupes de trois cartes distribuées (avec une bonne mémoire).
    En informatique, le mélange est complet!
    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
    >>> from random import shuffle
    >>> lst = [x for x in range(78)]
    >>> lst
    [0, 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, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77]
    >>> mains = lst[:]
    >>> mains
    [0, 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, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77]
    >>> shuffle(mains)
    >>> mains
    [63, 38, 48, 53, 2, 5, 13, 77, 46, 8, 56, 18, 42, 39, 20, 69, 58, 60, 23, 43, 55, 21, 54, 14, 19, 68, 67, 61, 36, 28, 35, 10, 24, 76, 30, 70, 65, 29, 37, 22, 62, 11, 33, 32, 75, 15, 57, 12, 73, 41, 0, 45, 59, 50, 74, 17, 27, 4, 44, 7, 1, 3, 16, 71, 47, 25, 34, 6, 66, 31, 72, 26, 9, 64, 51, 52, 49, 40]
    >>> a = mains[0:18]
    >>> b = mains[18:36]
    >>> c = mains[36:54]
    >>> d = mains[54:72]
    >>> chien = mains[72:]
    >>> a
    [63, 38, 48, 53, 2, 5, 13, 77, 46, 8, 56, 18, 42, 39, 20, 69, 58, 60]
    >>> b
    [23, 43, 55, 21, 54, 14, 19, 68, 67, 61, 36, 28, 35, 10, 24, 76, 30, 70]
    >>> c
    [65, 29, 37, 22, 62, 11, 33, 32, 75, 15, 57, 12, 73, 41, 0, 45, 59, 50]
    >>> d
    [74, 17, 27, 4, 44, 7, 1, 3, 16, 71, 47, 25, 34, 6, 66, 31, 72, 26]
    >>> chien
    [9, 64, 51, 52, 49, 40]
    >>>
    Cela pourrait même se réaliser dans une boucle!
    De même manière, pour coller encore plus au jeu, sans beaucoup de complication, la distribution de carte par trio est tout à fait réalisable!

    Clodion

    PS: pour distribuer trois par trois:
    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
    from random import shuffle
    # liste des 78 cartes: la première est 0!
    lst = [x for x in range(78)]
    # recopie de la liste
    mains = lst[:]
    # mélange
    shuffle(mains)
    # initialisation
    a, b, c, d, chien = [], [], [], [], []
    for ind in range(0, len(mains), 13):
        a += mains[ind: ind+3]
        b += mains[ind+3: ind+6]
        c += mains[ind+6: ind+9]
        d += mains[ind+9: ind+12]
        chien.append(mains[ind+12])
    print(a, b, c, d, chien, sep="\n")

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 6
    Par défaut
    Je vois!
    Votre méthode est tellement plus rapide et intelligente! Je ne connaissais pas la commande shuffle, j'ai appris quelque chose
    Un énorme merci à vous !

    Edit: Par contre j'obtiens un "list out of range" à la ligne 15 (pour la distribution 3 par 3), je vais essayer de voir à quoi cela est dû.
    edit2: à quoi correspond l'opération ?
    Merci.

  9. #9
    Membre émérite
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Par défaut
    Citation Envoyé par Rekkles Voir le message
    Edit: Par contre j'obtiens un "list out of range" à la ligne 15, je vais essayer de voir à quoi cela est dû.
    Bonsoir,
    Voilà ce que j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> 
    [77, 43, 52, 18, 31, 67, 29, 45, 56, 65, 47, 8, 46, 33, 15, 57, 40, 75]
    [42, 54, 5, 20, 13, 74, 68, 71, 27, 1, 53, 17, 38, 30, 64, 12, 35, 50]
    [60, 69, 14, 34, 2, 6, 70, 21, 61, 24, 51, 7, 41, 22, 25, 62, 10, 19]
    [48, 73, 39, 11, 49, 28, 76, 36, 4, 26, 37, 44, 3, 63, 58, 0, 9, 16]
    [32, 59, 72, 23, 66, 55]
    >>>
    Clodion

    PS: je suis sous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Python 3.4.2 (default, Jun 19 2015, 11:34:49) 
    [GCC 4.9.1] on linux
    Mais cela ne devrait faire aucune différence quant à l'indexation des listes!

    'sep="\n"'
    Dans un "print" deux options sont très utiles: "sep" qui sépare chaque item (par défaut un espace) et "end" qui sépare des lignes (par défaut "\n": un saut de ligne)

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

Discussions similaires

  1. Fonction qui ne s'exécute pas - Grand débutant !
    Par Lobstagg dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 24/04/2014, 11h17
  2. [eZ Publish] pb de sous-éléments qui ne s'actualisent pas
    Par ricozor dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 11
    Dernier message: 03/01/2012, 16h06
  3. Réponses: 11
    Dernier message: 04/10/2011, 12h53
  4. Une boucle infinie qui ne freeze pas ?
    Par humitake dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 14/04/2011, 11h45
  5. [WS 2003] Application qui ne se lance pas (problème de droits)
    Par beegees dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 23/02/2010, 17h34

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