Aide - Exercice programmation dictionnaire

Résolu/Fermé
bcleo - Modifié le 23 oct. 2019 à 16:14
 latata - 28 oct. 2019 à 10:52
Bonjour, J'ai un exercice a effectuer en Python 2.7, voici la consigne:

On veut entrée des données relatifs à 5souris males et 5 souris femelles. Ces souris sont soumises a des test : le temps qu'ils mettent à sortir du labyrinthe pour les males et nombre de fois que les souris sont sorties d'une piscine pour les femelles. Et cela pendant 5 jours. Le prof veut ensuite qu'on stock les valeurs dans des dictionnaires. (nom, sexe, poid au debut, performance (piscine et laby), poid au bout des 5 j). l'exercice s'organise sous forme de menu dans lequelle on choisie quelles infos on veut entrer.

Mais j'ai un soucis : je voudrais créer un dictionnaire pour chaque souris comme ci dessous:
dict_souris1={nom=lili, poid=5, sexe=F, perfo=oui}; j'ai donc crée une boucle, mais a chaque fois que j'entre les données de la 2eme souris, les données de la 1ere souris en sont remplacés. Je ne sais pas trop comment faire pour par exemple créer une nouveaux dictionnaire a chaque itération.

EN espérant que quelqu'un puisse gentiment m'aider
Bien à vous

Voici mon code : (nbr représente le nombre de jour, ici je n'ai mis que 2 pour ne pas perdre mon temps quand je teste le script)

def entreedonnee(dicosouris):    
    nbr=2
    
    for i in range(nbr):
        print "quelle est le nom de la souris",i
        nom=raw_input()
        print "quelle est le poid de cette souris"
        poid=input()
        dicosouris[nom]=dicopara        
        print "quelle est le sexe : "
        sexe=raw_input()
        dicopara["sexe"]=sexe
        dicopara["poid"]=poid
    return

def perfomal(dicosouris):
    jour=5
    listtemps=[]
    for i in dicosouris.keys():
        if (dicopara["sexe"]=="male"):         
            for j in range(jour):
                print "quel est le temps total ce jour",j," de la souris",i
                temps=input()
                dicopara["temps"]=listtemps
                listtemps.append(temps)
       
    print dicosouris       
    return

def perfofem(dicosouris):
    jour=5
    listsortie=[]
    for i in dicosouris.keys():
        if (dicopara["sexe"]=="femelle"):         
            for j in range(jour):
                print "la souris",i,"est elle sortie du laby le jour", j
                sortie=raw_input()
                dicopara["sortie"]=listsortie
                listsortie.append(sortie)
       
    print dicosouris       
    return
            
def perfofem(dicosouris):
    jour=5
    nbrsortie=0
    listsortie=[]
    for value in dicosexe.values():
        if "femelle" in dicosexe.values():
            for i in range(jour):
                print"est elle sortie de la piscine?"
                nbrsortie=raw_input()
                listsortie.append(nbrsortie)
                dicosortie[nbrsortie]=listsortie
                dicosouris[nom]=[dicopoid,dicosexe,dicosortie]
    return

def affiche(dicosouris):
    for cle in dicosouris.values():
        print "la souris",cle,"a le poid de", dicopara["poid"],"il s'agit d'une",dicopara["sexe"]
    
def meilleurtemps(dicosouris):
    Dico=dicosouris.keys()
    max=Dico[0]
    for cle in Dico:
        if (dicopara["sexe"]=="male"):
            if max<dicosouris[cle]:
                max=cle
    print max  

def poidsfin(dicopoidfin):
    for cle in dicosouris.keys():
        print "quelle est le poid finale de la souris",cle
        dicopara["poidfin"]=input()
    print dicosouris
    
def menu():
    print"Taper 1 pour entrer le nom poids du premier jour, sexe"
    print"Taper 11 pour entrer les performances des males"
    print"Taper 12 pour entrer les performances des femelles"
    print"Taper 2 pour afficher"
    print"Taper 3 pour connaitre le meilleure temps pour les males"
    print"Taper 4 pour savoir quelle femelle a le meilleur score"
    print"Taper 5 pour entrer le poid en fin d'experience"
 
dicosouris={}
dicopara={}
jour=2

nom=""
poid=0
sexe=""
while(True):
    menu()
    print "quelle est ton choix"
    choix=input()
    if choix==0:
        break
    elif choix==1:
        entreedonnee(dicosouris)
    elif choix==11:
        perfomal(dicosouris)
    elif choix==12:
        perfofem(dicosouris)
    elif choix==2:
        affiche(dicosouris)
    elif choix==3:
        meilleurtemps(dicosouris)        
    elif choix==4:
        meilleurtemps(dicosouris)
    elif choix==5:
        poidsfin(dicosouris)
  


Configuration: Linux / Firefox 59.0
A voir également:

2 réponses

jee pee Messages postés 39632 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 avril 2024 9 234
23 oct. 2019 à 16:19
Bonjour,

Je m'interroge sur le sens du mot dictionnaire. Il ne me viendrait pas l'esprit de programmer une saisie de données et de ne les conserver que dans un tableau mémoire. Je stockerais les données dans un fichier (ou une bdd), pour les conserver et les réutiliser.

Cdlt
0
Bonjour,
Oui biensur, jattends de résoudre mon problème avant d'écrire les commandes pour tout stocker dans un fichier, ce script n'est pas fini du tout.
Bien à vous
0
jee pee Messages postés 39632 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 avril 2024 9 234
Modifié le 23 oct. 2019 à 19:10
Je ne fais par vraiment de python, juste un peu pour répondre ici aux questions de base. Donc je n'avais pas compris que dictionnaire est un terme du langage, un type de données. Je l'ai juste vu en recherchant des infos sur les tableaux et les listes.

J'ai avec un bout de ton code effectué des essais

def entreedonnee(dicosouris):    
    nbr=2
    for i in range(nbr):
        print "Quel est le nom de la souris N ",i, " "
        nom=raw_input()
        print "Quel est son poids : "
        poids=input()
        print "Quel est son sexe  : "
        sexe=raw_input()
        dicopara={}
        dicopara["sexe"]=sexe
        dicopara["poids"]=poids
        dicosouris[nom]=dicopara  
    return

dicosouris={}
dicopara={}
jour=2

nom=""
poids=0
sexe=""
entreedonnee(dicosouris)
print(dicosouris)
print(dicopara)
print(dicosouris['Tom'])


Quel est le nom de la souris N  0  
Quel est son poids :
Quel est son sexe :
Quel est le nom de la souris N 1
Quel est son poids :
Quel est son sexe :
{'Daisy': {'sexe': 'f', 'poids': 15}, 'Tom': {'sexe': 'm', 'poids': 20}}
{}
{'sexe': 'm', 'poids': 20}


Dans dicosouris on récupère bien les infos des 2 souris. Je ne pige pas bien la structure que tu cherches au final, mais le dictionnaire pourrait aussi contenir
{1: {'nom':'Daisy',sexe': 'f', 'poids': 15}, 0: {'nom':'Tom','sexe': 'm', 'poids': 20}}
0
Merci beaucoup pour votre reponse !!!!
0
Bonsoir.

Lorsque tu fais
dicosouris[nom]=dicopara
dans ta fonction
entreedonnee
, tous les dictionnaires créés pointent sur le même dictionnaire (dicopara).

Donc, il faut revoir ce qu'il se passe dans cette fonction, en créant un dict pour chaque souris créée.

def entreedonnee(dicosouris):
    nbr=2

    for i in range(nbr):
        print "quelle est le nom de la souris",i
        nom=raw_input()
        print "quelle est le poid de cette souris"
        poid=input()
        # dicosouris[nom]=dicopara
        dicosouris[nom] = dict()
        print "quelle est le sexe : "
        sexe=raw_input()
        dicosouris[nom]["sexe"] = sexe
        dicosouris[nom]["poid"] = poid
    return


Il faut donc revoir aussi (entre autres) la fonction d'affichage qui devra être modifiée ainsi.

def affiche(dicosouris):
    for cle, dico in dicosouris.items():
        print "la souris",cle,"a le poid de", dico["poid"],"il s'agit d'une",dico["sexe"]


Le dict global dicopara n'a donc plus raison d'exister, tu peux l'enlever de ton code ;-)
0
Merci beaucoup ! Ça m'a beaucoup aidé !
0
J'ai juste une autre petite question qui n'a pas de lien avec les dictionnaires mais j'ai vraiment du mal à assimiler cette notion :
dans les definition de fonctions, les paramètres entre parenthèse sont necessaire afin de donner les valeur necessaire au deroulement de la fonction c'est bien ça ?
Et le return seul sert bien a stoppé la fonction, et le return avec des arguments cette a renvoyer la valeur de la variable ?

En esperant que vous puissiez me repondre :)
0
khrug > bcleo
26 oct. 2019 à 08:48
Bonjour,

dans les definition de fonctions, les paramètres entre parenthèse sont necessaire afin de donner les valeur necessaire au deroulement de la fonction c'est bien ça ?

Oui, c'est ça, on peut aussi définir des paramètres optionnels (ayant une valeur par défaut).

Et le return seul sert bien a stoppé la fonction, et le return avec des arguments cette a renvoyer la valeur de la variable ?

Mettre un return sans valeur derrière équivaut à faire
return None
sinon oui c'est l'objet stipulé à la suite qui sera renvoyé.
Oui, un return met fin à l'exécution de la fonction, et même d'une boucle dans le cas ou fait un return dans une boucle située dans une fonction.
Note qu'il est inutile de mettre un return sans rien en fin d'une fonction, python retourne None par défaut.
0
Merci beaucoup !!!!
0