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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

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