Ajouter plusieurs valeurs à une même clé python

Fermé
Just1bidon - 22 mai 2023 à 20:10
 nooik - 23 mai 2023 à 14:48

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

A voir également:

4 réponses

NHenry Messages postés 15164 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 27 novembre 2024 345
22 mai 2023 à 21:34

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


1
Just1bidon Messages postés 5 Date d'inscription lundi 22 mai 2023 Statut Membre Dernière intervention 4 juin 2023
23 mai 2023 à 08:22

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
PierrotLeFou
23 mai 2023 à 06:54

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
Just1bidon Messages postés 5 Date d'inscription lundi 22 mai 2023 Statut Membre Dernière intervention 4 juin 2023
23 mai 2023 à 08:19
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
nooik > Just1bidon Messages postés 5 Date d'inscription lundi 22 mai 2023 Statut Membre Dernière intervention 4 juin 2023
23 mai 2023 à 10:17

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
Just1bidon Messages postés 5 Date d'inscription lundi 22 mai 2023 Statut Membre Dernière intervention 4 juin 2023 > nooik
Modifié le 23 mai 2023 à 13:30

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
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
23 mai 2023 à 13:51

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
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
23 mai 2023 à 13:40

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
Just1bidon Messages postés 5 Date d'inscription lundi 22 mai 2023 Statut Membre Dernière intervention 4 juin 2023
Modifié le 23 mai 2023 à 14:02

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

0
nooik > Just1bidon Messages postés 5 Date d'inscription lundi 22 mai 2023 Statut Membre Dernière intervention 4 juin 2023
23 mai 2023 à 14:48

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