Ajouter plusieurs valeurs à une même clé python

Just1bidon -  
 nooik -

Bonjour,

Je voudrais ajouter plusieurs valeurs à une même clé python à l'aide d'une boucle for loop in range, mais je n'y arrive pas. Voici mon code :

def Distribuer_cartes():
    joueurs=Nb_joueurs()
    for i in range (joueurs):
        mains_joueurs['Joueurs '+str(i+1)]=None
        for loop in range (1,8):
            card=Genere_carte_aleatoire()
            mains_joueurs['Joueurs '+str(i+1)]=card #c'est ici le problème
    return mains_joueurs

A l'appel de le fonction :

Distribuer_cartes()
Combien de joueurs : 2
{'Joueurs 1': ('3', 'rouge')}
{'Joueurs 1': ('1', 'jaune')}
{'Joueurs 1': ('3', 'rouge')}
{'Joueurs 1': ('1', 'jaune')}
{'Joueurs 1': ('+2', 'bleu')}
{'Joueurs 1': ('+2', 'rouge')}
{'Joueurs 1': ('0', 'vert')}
{'Joueurs 1': ('0', 'vert'), 'Joueurs 2': ('passe ton tour', 'rouge')}
{'Joueurs 1': ('0', 'vert'), 'Joueurs 2': ('3', 'bleu')}
{'Joueurs 1': ('0', 'vert'), 'Joueurs 2': ('0', 'rouge')}
{'Joueurs 1': ('0', 'vert'), 'Joueurs 2': ('4', 'rouge')}
{'Joueurs 1': ('0', 'vert'), 'Joueurs 2': ('+2', 'jaune')}
{'Joueurs 1': ('0', 'vert'), 'Joueurs 2': ('0', 'rouge')}
{'Joueurs 1': ('0', 'vert'), 'Joueurs 2': ('1', 'vert')}
Out[94]: {'Joueurs 1': ('0', 'vert'), 'Joueurs 2': ('1', 'vert')}

J'ai déjà identifier le problème : à chaque tour de boucle l'ancienne valeur associer à la clé ['Joueurs '+str(i+1)] est écraser e

pas ce que je veux, je voudrais simplement pouvoir ajouter ou retirer plusieurs tuple associer à une même clé.

Merci de votre aide.


Windows / Chrome 113.0.0.0

4 réponses

  1. NHenry Messages postés 15235 Date d'inscription   Statut Modérateur Dernière intervention   387
     

    Au lieu d'essayer d'assigner une valeur, pourquoi ne pas assigner une liste (donc modifiable) et la modifier (ajouter un nouvel item) ?


    1
    1. Just1bidon Messages postés 6 Statut Membre
       

      C'est ce que j'avais pour but initialement mais je n'ai pas réussi à le faire comme je voulais.

      Avez-vous des une idée, voici mon code (j'ai pour but de faire un UNO en python tout seul avec mes connaissances) :

      import random
      
      #Initialisation des variables
      pioche=None
      
      def Nb_joueurs(): #On demande le nombre de joueurs
          joueurs = int(input("Combien de joueurs : "))
          return joueurs
      
      
      #On crée les cartes
      
      cartes={'nb':19, 'couleur':['bleu','vert','rouge','jaune'], 'valeurs':['0','1','2','3','4','5','6','7','8','9','+2','passe ton tour']}
      mains_joueurs={}
      
      
      
      
      def Valeur_aleatoire (): # genere une couleur aleatoire parmis celle du dico "cartes"
          card_valeur = cartes.get('valeurs')
          indice = random.randint(0,11)
          return card_valeur[indice]
      
      
      def Couleur_aleatoire (): # genere une couleur aleatoire parmis celle du dico "cartes"
          card_couleur = cartes.get('couleur')
          indice = random.randint(0,3)
          return card_couleur[indice]
      
      
      def Genere_carte_aleatoire(): # genere une carte aleatoire avec une valeur et une couleur aleatoire
          valeur = Valeur_aleatoire()
          couleur = Couleur_aleatoire()
          return str(valeur), str(couleur)
      
      
      
      
      # fonction pour distribuer les cartes en debut de parties
      def Distribuer_cartes():
          joueurs=Nb_joueurs()
          for i in range (joueurs):
              mains_joueurs['Joueurs '+str(i+1)]=None
              for loop in range (1,8):
                  card=Genere_carte_aleatoire()
                  mains_joueurs['Joueurs '+str(i+1)]=card
          return mains_joueurs
      0
  2. PierrotLeFou
     

    Je me demande comment tu réussis à générer un  semblant de dictionnaire avec le code que tu montres ...
    La boucle intérieure s'exécute 7 fois. C'est bien ce que tu veux?
    Tu pourrais évaluer la clé une seule fois dans la boucle extérieure.
    Utilises .append() pour ajouter un nouveau tuple à ta liste.
    Je pourrais te suggérer autre chose de plus simple si je savais ce que tu veux faire.

    1
    1. Just1bidon Messages postés 6 Statut Membre
       
      import random
      
      #Initialisation des variables
      pioche=None
      
      def Nb_joueurs(): #On demande le nombre de joueurs
          joueurs = int(input("Combien de joueurs : "))
          return joueurs
      
      
      #On crée les cartes
      
      cartes={'nb':19, 'couleur':['bleu','vert','rouge','jaune'], 'valeurs':['0','1','2','3','4','5','6','7','8','9','+2','passe ton tour']}
      mains_joueurs={}
      
      
      
      def Valeur_aleatoire (): # genere une couleur aleatoire parmis celle du dico "cartes"
          card_valeur = cartes.get('valeurs')
          indice = random.randint(0,11)
          return card_valeur[indice]
      
      
      def Couleur_aleatoire (): # genere une couleur aleatoire parmis celle du dico "cartes"
          card_couleur = cartes.get('couleur')
          indice = random.randint(0,3)
          return card_couleur[indice]
      
      
      def Genere_carte_aleatoire(): # genere une carte aleatoire avec une valeur et une couleur aleatoire
          valeur = Valeur_aleatoire()
          couleur = Couleur_aleatoire()
          return str(valeur), str(couleur)
      
      
      
      
      # fonction pour distribuer les cartes en debut de parties
      def Distribuer_cartes():
          joueurs=Nb_joueurs()
          for i in range (joueurs):
              mains_joueurs['Joueurs '+str(i+1)]=None
              for loop in range (1,8):
                  card=Genere_carte_aleatoire()
                  mains_joueurs['Joueurs '+str(i+1)]=card
          return mains_joueurs

      Voici mon code entier actuellement.

      En fait je cherche à faire un UNO en python tout seul et la je voudrais faire une fonction qui distribue les 7 cartes de début de partie.

      Je ne comprend pas lorsque vous me parlez du .append car j'ai déjà essayer mais comme c'est un dictionnaire ca ne marche pas.

      0
      1. nooik > Just1bidon Messages postés 6 Statut Membre
         

        Salut.

        Comme dit plus haut, sers-toi de listes.

        def Distribuer_cartes():
            joueurs = Nb_joueurs()
            mains = {f'joueur_{i}':[] for i in range(1, joueurs + 1)}
            for main in mains.values():
            # for i in range(joueurs):
                # mains_joueurs['Joueurs '+str(i+1)]=None
                for loop in range (1,8):
                    card = Genere_carte_aleatoire()
                    main.append(card)
                    # mains_joueurs['Joueurs '+str(i+1)]=card #c'est ici le problème
            return mains
        
        from pprint import pprint
        pprint(Distribuer_cartes())

        Mais en l'état on se retrouvera avec des doublons, normal puisque tu génères chaque fois une carte aléatoire sans te préoccuper de ce qui a été prélevé avant.

        Tu dois d'abord générer les cartes (list), les mélanger, puis inutile de se prendre la tête, un simple pop de la pile, vers la main joueur, pas plus compliqué que ça.

        1
      2. Just1bidon Messages postés 6 Statut Membre > nooik
         

        Bonjour,

        Je vous remercie pour votre code qui marche.

        Cependant je ne connais pas "pprint" (qui après recherches sert apparemment à afficher "de manière élégante), si vous avez d'autres précisions sur ce pprint je suis preneur.

        Ensuite, cette ligne de code :

        mains = {f'joueur_{i}':[] for i in range(1, joueurs + 1)}

        C'était mon idée de base hors je ne trouvais aucun moyen avec mes connaissances de le faire, et sur conseils de mon prof de NSI de Terminale, j'ai tenter de faire avec un dictionnaire.

        J'ai compris que la ligne permet de générer une liste vide pour chaque joueurs, mais si vous pouvez m'expliquer un peu plus précisément cette ligne de code je suis également preneur (en particulier le f'joueur_{i}').

        Enfin, sur le problème des doublons, je sais qu'il y en aura et je résoudrait ce problème plus tard.

         En tout cas merci de votre aide.

        0
  3. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     

    Bah, c'en est toujours un exemple avec le paquet de cartes

    Ensuite, la distribution par joueur est classique ... et en 30 lignes, c'est fait !

    1
  4. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     

    Bonjour,

    Tu pourrais faire un truc comme ça:

    import random
    
    class Pack():
        def __init__(self,faces,colors):
            self.cards = []
            for k in range(len(colors)):
                for j in range(len(faces)):
                    self.cards.append(faces[j]+' '+colors[k])
    
            random.shuffle(self.cards)
    
    faces = ['0','1','2','3','4','5','6','7','8','9']
    colors = ['bleu','vert','rouge','jaune']
    pack = Pack(faces,colors)
    
    players_nb = int(input("Combien de joueurs : "))
    
    stop = False
    player_game = {}
    
    while(True):
        for k in range(players_nb):
            if(not player_game.get(k)): player_game[k] = []
            if(pack.cards != []):
                player_game[k].append(pack.cards.pop())
            else:
                stop = True
                break
    
        if(stop): break
    0
    1. Just1bidon Messages postés 6 Statut Membre
       

      Je vous remercies mais je ne suis absolument pas caler avec la programmation objet.

      0
      1. nooik > Just1bidon Messages postés 6 Statut Membre
         

        Tu dois forcément être calé, puisque tu en manipules ^^ (en python tout est objet)

         Moins objet,

        import random
        
        COLORS = 'bleu','vert','rouge','jaune'
        VALUES = '0','1','2','3','4','5','6','7','8','9','+2','passe ton tour'
        
        
        def deal(cards, hand_number):
            random.shuffle(cards)
            hands = []
            for _ in range(hand_number):
                hand = []
                for __ in range(7):
                    hand.append(cards.pop())
                hands.append(hand)
            return hands
        
        
        def players_show(players):
            for player in players:
                print(player['name'], ' : ')
                for card in player['hand']:
                    print('\t', card)
                print()
        
        players_name = 'lola', 'toto', 'poupi'
        players = [
            dict(name=name, hand=[]) for name in players_name
        ]
        cards = [(value, color) for value in VALUES for color in COLORS]
        for i, hand in enumerate(deal(cards, len(players))):
            players[i]['hand'].extend(hand)
        
        players_show(players)
        1