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 :

Comparer les clés de dictionnaires


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 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 96
    Par défaut Comparer les clés de dictionnaires
    Bonjour,

    je dispose d'une liste de dictionnaires et je voudrai stocker dans une liste les clés qui sont communes à tous les dictionnaires ainsi que les valeurs associées à ces dicos. J'ai trouvé un topic assez similaire de michel42 avec une réponse complète de mont29, cependant mon niveau de Python est clairement trop faible pour appliquer ( et surtout comprendre) ce code

    Voici ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    # mes_dicos est une liste de dictionnaires
    L=[] # L va contenir des tuples contenant les clé / valeurs des dicos
    	for id, value in mes_dicos[0].items(): # je prends comme référence le 1er dico de la liste
    		for i,dico in enumerate(mes_dicos): # je parcours tous mes dicos
     
    			if id in mes_dicos[i] and id in mes_dicos[len(mes_dicos)-1]: # je test si la clé est commune à tous mes dicos
    				L.append((id,mes_dicos[i].get(cle))) # si oui j'ajoute les éléments à ma liste
    Le problème vient de ma condition, je teste juste si la clé issue du dico de référence est présente dans le dico numéro i et dans le dernier dico. Ma condition ne permet pas de tester l'ensemble des dictionnaires de ma liste.

    Y aurait'il un moyen "simple" de réussir à tester la clé issue de mon dico de référence contre toutes les autres clés ? (Je ne sais pas à l'avance de combien de dicos sera composée ma liste).

    Merci à vous

  2. #2
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Bonjour,

    tu peux utiliser les sets pour trouver les clés presentes dans tous les dictionnaires:
    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
    d1 = {'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4}
    d2 = {'c': 6, 'b': 4, 'd': 8}
    d3 = {'c': 12, 'e': 25, 'd': 16}
     
    ds = [d1, d2, d3]
     
    s = set(ds[0].keys())
    for d in ds[1:]:
        s.intersection_update(d.keys())
     
    liste = []
    for k in s:
        liste.append((k, [d[k] for d in ds]))
     
    print liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [('c', [3, 6, 12]), ('d', [4, 8, 16])]

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 96
    Par défaut
    Bonjour pacificator et merci pour votre réponse,

    j'ai testé votre code et cela répond à ma problématique, le seul soucis c'est qu'au bureau la version de Python est la 2.6.5, et d'après ce que j'ai trouvé dans la documentation, la méthode intersection_update est compatible uniquement avec les versions 2.7 +.

    Y a t'il une méthode équivalente pour des versions antérieures ? Malheureusement je ne peux pas modifier la version de Python au bureau.

  4. #4
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    je suis en version 2.6.5 aussi

  5. #5
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Bon, on va s’amuser un peu et voir une solution sans set, d’abord.

    L’algo est celui-ci*:
    * on stocke toutes les clés du premier dico dans une liste
    * pour tous les autres dicos:
    ** on boucle dessus sur la liste de clés, si la clé courante est présente dans le dico_2, on l’ajoute à une liste temporaire, sinon rien.
    ** on remplace la liste par la liste temporaire

    Une fois tous les dicos parcourus, notre liste ne contient que les clés qui sont communes à tous les dicos (le reste est trivial).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    keys = dicos[0].keys()
    for dico in dicos[1:]:
        t_keys = []
        for k in keys:
            if k in dico:
                t_keys.append(k)
        keys = t_keys
     
    result = []
    for k in keys:
        t_values = []
        for dico in dicos:
            t_values.append(dico[k])
        result.append((k, values))
    À noter:
    * On gagne souvent à découper le problème en plusieurs parties, quand il commence à devenir un peu délicat (ci-dessus, on pourrait parfaitement se passer de la deuxième boucle, et enregistrer les valeurs en même temps qu’on filtre les clés, mais ça rendrait le code plus confus, moins facile à suivre).
    * On peut rendre ce code nettement plus compact avec les comprehensions*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    keys = dicos[0].keys()
    for dico in dicos[1:]:
        keys = [k for k in keys if k in dico]
     
    result = [(k, [d[k] for d in dicos]) for k in keys]
    Compact, s’pas*?

    Enfin, pour le fun, la version avec sets, comprehensions et reduce()*:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import functools  # Why in hell isn’t reduce in standard funcs???
    keys = functools.reduce(lambda a, b: a & b, (set(d) for d in dicos[1:]), set(dicos[0]))
     
    result = [(k, [d[k] for d in dicos]) for k in keys]
    [Edit] Woops, ça a bougé entre temps… Sauf erreur de ma part, les deux premières versions devraient être compatibles avec les vieux pythons chenus et barbus…

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 96
    Par défaut
    je suis en version 2.6.5 aussi
    En effet j'ai mal lu désolé
    Merci encore pour votre solution

    Merci mont29 pour vos solutions, en effet votre première solution (la plus "longue") est celle que j'arrive le mieux à interpréter, je prends bonnes notes de ces simplifications et j'espère vite être capable des les maîtriser.

    Merci beaucoup

    Et joyeuses pâcques

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comment organiser les noms des clés de dictionnaire
    Par micamused dans le forum Général Python
    Réponses: 3
    Dernier message: 27/08/2014, 21h52
  2. Récupérer les clés de mon dictionnaire
    Par tom77380 dans le forum Général Python
    Réponses: 4
    Dernier message: 18/12/2011, 00h41
  3. les clés d'un dictionnaire
    Par billyrose dans le forum Général Python
    Réponses: 4
    Dernier message: 03/08/2008, 14h22
  4. Comparer les clés d'une Map
    Par Tourix dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 27/10/2006, 12h43
  5. Comparer les types de variable
    Par onipif dans le forum ASP
    Réponses: 11
    Dernier message: 27/05/2004, 18h07

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