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 :

Encore ce dictionnaire de listes


Sujet :

Python

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 69
    Par défaut Encore ce dictionnaire de listes
    Grâce à Tyrtamos, j'ai pu créer un dictionnaire ou les valeurs sont sous forme de listes, de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dico={}
    for x,y in liste:
        if x in dico:
            dico[x].append(y)
        else:
            dico[x]=[y]
    (ou liste était de la forme: [['x1','y1'],['x2','y2'],['x3','y3']])

    J'ai donc un dictionnaire du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dico={'a'=['A','B','C','D'], 'b'=['E','F','G']}
    Et je ne comprends pas, parce que je voudrais comparer les clés du dictionnaire avec les éléments d'une liste normale, et quand ils sont égaux, ajouter les valeurs du dictionnaire dans une nouvelle liste.

    Alors, quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i in range(len(dico.keys())):
            print dico.keys()[i]
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for j in liste2:
            print j
    Le type est le meme et certaines valeurs sont identiques.
    (liste2 est une liste classique: liste2=['a','b','c','d'])

    Donc, je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    liste3=[]
    for i,j in zip(range(len(dico.keys())),liste2):
    	if dico.keys()[i] == j:
    		liste3.append(dico.values()[i])
    Et là, ma liste3 est vide...
    Je ne comprends pas.

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je ne suis pas sûr d'avoir compris ce que tu voulais faire, mais ton code donne des résultats:

    avec (il y a une erreur dans le dico de ton message: c'est ':' et pas '='):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dico={'a':['A','B','C','D'], 'b':['E','F','G']}
    liste2=['a','b','c','d']
    ton code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    liste3=[]
    for i,j in zip(range(len(dico.keys())),liste2):
        if dico.keys()[i]==j:
            liste3.append(dico.values()[i])
    donne pour liste3:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [['A', 'B', 'C', 'D'], ['E', 'F', 'G']]
    En effet,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    range(len(dico.keys()))  =>  [0, 1]
    liste2  =>  ['a', 'b', 'c', 'd']
    zip(range(len(dico.keys())),liste2)  => [(0, 'a'), (1, 'b')]
    dico.keys()  => ['a', 'b']
    Par rapport à ça, le résultat de liste3 est correct.

    Si je n'ai pas bien compris, donne un ensemble "données de départ -> données d'arrivée".

    Tyrtamos

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Ta dernière boucle for ne fait a priori pas ce que tu voudrais qu'elle fasse, zip itère sur des couples d'éléments, pris dans l'ordre, il n'énumère pas toutes les combinaisons possibles.

    Pour ton problème, une petite list comprehension peut faire l'affaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste3 = [dico[k] for k in liste2 if k in dico]
    Un détail concernant les dictionnaires: pour itérer sur les clés, au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i in range(len(dico.keys())):
            print dico.keys()[i]
    qui n'est pas très joli, tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for key in dico:
        print key

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 69
    Par défaut
    1ère question :

    Tyrtamos,

    Oui, le code que j'ai écrit fonctionne seulement si l'ordre entre les clés du dictionnaire et les valeurs dans la liste correspondent.
    Ici, c'était le cas, 'a' était en 1er, 'b' en 2ème, et pareil dans liste2.

    Seulement, ce n'est pas le cas partout, et pourtant, j'ai quand meme des valeurs identiques.

    Par exemple, mon code ne fonctionne donc pas pour :
    un dictionnaire comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dico={'a':['A','B','C','D'], 'b':['E','F','G']}
    avec une liste comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste2=['c','d','a','b']
    Du coup, je pense que ça vient du zip.
    Mais si je supprime le zip et que j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    liste3=[]
    for i in dico.keys():
    	for j in liste2:
    		if i == j:
    			liste3.append(dico.values())
    Il me renvoie une liste qui ne se termine pas, du fait de la deuxième boucle for, il réitère à l'infini....

    Comment faire?


    2ème question :
    J'en profite pour demander de l'aide sur un autre problème:
    J'ai créé un dictionnaire ressemblant à celui précedemment, c'est-à-dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dico={'A' : [0.4376, 1.4985, 0.0768], 'B' : [2.6622, 0.2265]}
    Ce que je voudrais faire, c'est pour chaque clé du dico, faire la somme de ces valeurs pour n'obtenir finalement que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste=[['A',moyenneA],['B',moyenneB]]
    Je sais que par clé, il faut faudrait faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i in dico['A']:
        moyenne=sum(i)/len(dico['A'])
    Seulement j'ai 120 clés, donc il faudrait faire une boucle pour itérer, mais j'ia le meme problème que ci-dessus, elle itère à l'infini

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Pour la 1ère question:

    Essaye cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
     
    dico={'a':['A','B','C','D'], 'b':['E','F','G']}
    liste2=['c','d','a','b']
     
    liste3=[]
    for k in liste2:
        if dico.has_key(k):
            liste3.append(dico[k])
     
    print liste3  #  affiche: [['A', 'B', 'C', 'D'], ['E', 'F', 'G']]
    Pour la 2ème question:

    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
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
     
    dico={'A' : [0.4376, 1.4985, 0.0768], 'B' : [2.6622, 0.2265]}
     
    liste=[]
    for k in dico:
        m=0
        for x in dico[k]:
            m+=x
        m=m/len(dico[k])
        liste.append([k,m])
     
    print liste # affiche: [['A', 0.67096666666666671], ['B', 1.44435]]
    Ok?

    Tyrtamos

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut Bonjour Victoria
    Courage. AVec un pseudo pareil, tu vas y arriver !



    Au niveau théorique, je ne comprends pas ton affirmation
    Il me renvoie une liste qui ne se termine pas, du fait de la deuxième boucle for, il réitère à l'infini....
    Je ne vois pas comment une boucle 'for' peut tourner à l'infini. Une boucle 'while', oui, mais 'for' ...?

    Au niveau pratique, j'ai fait tourner le code suivant issu de ce que tu as écrit dans "1ère question", en rajoutant seulement des 'print':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    dico={'a':['A','B','C','D'], 'b':['E','F','G']}
    liste2=['c','d','a','b']
     
    liste3=[]
    for i in dico.keys():
        print '*********** i =',i
        for j in liste2:
            print 'j =',j
            if i == j: 
                print '  i = j'
                liste3.append(dico.values())
                print '  liste3 =',liste3
    Il ne tourne pas à l'infini, et il donne le résultat suivant qui n'est sans doute pas celui que tu recherches:
    liste3 = [[['A', 'B', 'C', 'D'], ['E', 'F', 'G']], [['A', 'B', 'C', 'D'], ['E', 'F', 'G']]]


    Petite remarque:
    il est plus pratique d'avoir un code d'un seul bloc dans un message, cela permet de le copier/coller rapidement pour le faire tourner, et surtout de savoir quel code il faut assembler. Dans ton premier message, je n'ai pas compris quel est le code dont il est question finalement.

    Salut

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 69
    Par défaut
    Merci beaucoup Tyrtamos, ton code fonctionne.


    Eyquem, oui j'obtenais le meme résultat que toi du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste3 = [[['A', 'B', 'C', 'D'], ['E', 'F', 'G']], [['A', 'B', 'C', 'D'], ['E', 'F', 'G']]]
    Seulement, en fait, j'ai 120clés différentes, et comme je bouclais 2 fois: une fois sur le dico, une fois sur ma liste2, j'avais 120fois les valeurs des 120clés, donc 240fois.
    En effet, ce n'est pas à l'infini, erreur de language, mais disons qu'il bouclait 2fois, et que j'avais des résultats en double dans une liste pas directement exploitable du fait des triples crochets.
    Et en ce qui concerne mon premier message, c'est vrai que je devrais mettre le code en un seul bloc
    Le problème que j'avais dans le premier message, c'était que mes dernieres code que j'ai posté, ne fonctionnait pas, c'est-à-dire celles-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    liste3=[]
    for i,j in zip(range(len(dico.keys())),liste2):
    	if dico.keys()[i] == j:
    		liste3.append(dico.values()[i])


  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut OK
    Même si un code ne marche pas, je trouve personnellement que c'est bien de l'avoir d'un seul bloc: on le copie/colle et on part de lui pour débugger selon ses propres habitudes.

    Je sais qu'il y a un logiciel spécialement destiné à débugger de façon aisée. Personnellement je ne l'utilise pas encore et je me débrouille en truffant mes codes de print et de raw_input() à certains endroits.
    À savoir: après l'exécution d'un code ouvert par "Edit with IDLE", en tapant une instruction, on peut obtenir la valeur de n'importe quelle variable au moment de la fin d'exécution, ou par une instruction 'if' vérifier si une valeur se trouve dans une liste de 17000 éléments sans faire printer la liste. C'est aussi faisable si le programme a planté et s'arrête sur un message d'erreur.


    La "list comprehension" indiquée par oiffrig est impeccable, non ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 69
    Par défaut
    Oui, exact, c'est sure que c'est beaucoup plus pratique pour vous après de savoir quel est le problème et d'essayer de le résoudre.

    J'essaye aussi de mettre des print de temps à autres pour voir ce que j'ai dans telle liste et tout, mais c'est vrai que ça imprime tout à chaque fois, et si la liste est longue, c'est dur de retrouver l'élément que l'on cherche.

    Qu'est ce que la "list comprehension"?
    Ou est elle indiquée?

  10. #10
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Citation Envoyé par Victoria007 Voir le message
    Qu'est ce que la "list comprehension"?
    Ou est elle indiquée?
    Citation Envoyé par oiffrig Voir le message
    Pour ton problème, une petite list comprehension peut faire l'affaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste3 = [dico[k] for k in liste2 if k in dico]
    Une "list comprehension" est un moyen (que je trouve particulièrement intuitif) de générer des listes, elles permettent de contracter des petites boucles for (une ou plusieurs) et permettent l'utilisaton d'un if.

    En la "dépliant" on obtiendrait ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    liste3 = []
    for k in liste2:
        if k in dico:
            liste3.append(dico[k])

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 69
    Par défaut
    Merci beaucoup

    Ca va beaucoup m'aider à présent !

Discussions similaires

  1. Dictionnaire et liste de mot
    Par cinette dans le forum Services
    Réponses: 0
    Dernier message: 30/04/2008, 18h47
  2. Réponses: 2
    Dernier message: 19/11/2007, 22h39
  3. Encore un problème de liste
    Par Boubou Balrog dans le forum Prolog
    Réponses: 2
    Dernier message: 19/12/2006, 12h41
  4. encore un pb de liste déroulante
    Par Kelly182 dans le forum Access
    Réponses: 4
    Dernier message: 12/07/2006, 18h54
  5. Problème "for" dans dictionnaire de liste
    Par Sayrus dans le forum Général Python
    Réponses: 3
    Dernier message: 15/02/2006, 16h35

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