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 :

Appartenance d'une clé à plusieurs dictionnaires


Sujet :

Python

  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 Appartenance d'une clé à plusieurs dictionnaires
    Bonjour à tous,

    je manipule les clés de dictionniares et je suis bloqué quant à un principe de comparaison. Voici de quoi je pars:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dico1 = {'michel' : '1', 'toto':'1', 'jean':'1'} 
    dico2 = {'michel' : '1', 'toto':'1'}
    dico3 = {'michel':'1','eric':'1'}
    Je dispose de dictionnaires contenant des clés (les valeurs n'ont pas d'importances) et j'aimerai pouvoir, pour chaque clé unique, déterminer dans combien de dico elle apparait, par exemple j'aimerai obtenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    michel   dico1   dico2  dico3
    toto     dico1   dico2
    jean     dico1
    eric                    dico3
    C'est à dire, pour chacun des clés, dans quels dicos apparait'elle. Le soucis est que je ne connais pas à l'avance le nombre de dicos que je vais manipuler (stocker dans une liste de dicos). Là où je bloque c'est que j'arrive à comparer un dictionnaire avec le dictionnaire suivant (i+1), mais je n'arrive pas à faire la comparaison sur l'ensemble des dicos. Concretement je ne fais que des comparaisons 2 à 2.

    Voici mon code :

    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
    17
    stockage = [] #stockage est une liste qui contient toutes les clés que j'écris, grâce à ca je peux tester si j'ai deja écris la clé que je traite
     
    for comp,i in enumerate(liste_de_dicos[:-1]): # la dernière valeur de ma liste de dico est une valeur nulle, je peux donc réaliser des incrémentations en m'arrétant à l'avant dernière valeur de la liste
     
    	for cle,valeur in i.items():   # je parse chacun de mes dicos (i)
    		if cle in stockage: #si la clé est dans la liste de stockage (donc déjà écrite), alors je passe
    			pass
    		else:	
     
    			if cle in liste_de_dicos[comp+1]: # je test la clé du dico i avec la clé du dico i+1
    				#j'écris ma clé et ses 2 dicos associés....
    				stockage.append(cle) #ajout de la clé à ma liste
     
     
    			else:
    				#j'écris ma clé et son dico
    				stockage.append(cle) # ajout de la clé à la liste
    Ce code fonctionne pour des comparaisons 2 à 2, mais comment faire pour tester la clé de mon dico 1 avec tous les autres dicos ? Puis le dico2 avec tous les autres dicos etc...

    Merci à vous

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    Je dispose de dictionnaires contenant des clés (les valeurs n'ont pas d'importances) et j'aimerai pouvoir, pour chaque clé unique, déterminer dans combien de dico elle apparait, par exemple j'aimerai obtenir
    Tiens c'est original !

    C'est à dire, pour chacun des clés, dans quels dicos apparait'elle. Le soucis est que je ne connais pas à l'avance le nombre de dicos que je vais manipuler (stocker dans une liste de dicos)
    Sans doute une erreur de conception, tu devrais connaître le nombre étant donné que tu utilises les dicos pour faire tes enregistrements.

    Là où je bloque c'est que j'arrive à comparer un dictionnaire avec le dictionnaire suivant (i+1), mais je n'arrive pas à faire la comparaison sur l'ensemble des dicos
    Tout est objet en python, il suffit de placer tes dicos dans une liste par exemple, et tu fais tes comparaisons avec une boucle for.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if cle in stockage:
        pass
    Tu peux certainement faire mieux que le code ci-dessus, non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    else:	
        if cle in liste_de_dicos[comp+1]:


    Ce code fonctionne pour des comparaisons 2 à 2, mais comment faire pour tester la clé de mon dico 1 avec tous les autres dicos ? Puis le dico2 avec tous les autres dicos etc...
    Tout dans une liste, et comparaison avec une boucle for... Je sais je me répète, mais ça marche, promis

    Maintenant que tu as un petit peu de bouteille avec python je me permet de te faire réfléchir un peu, ça te sera sans doute plus utile que de te donner la réponse finale de suite.

    Un petit exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> dico_1 = {"cle_1" : "Hello", "cle_2" : "Goodbye"}
    >>> dico_2 = {"cle_3" : "Bonjour", "cle_4" : "Au revoir"}
    >>> liste_dic = [dico_1, dico_2]
    >>> for dic in liste_dic:
    ...     for cle in dic:
    ...         print cle
    ... 
    cle_2
    cle_1
    cle_4
    cle_3

  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
    Bonsoir fred1599 et merci pour votre réponses,

    Sans doute une erreur de conception, tu devrais connaître le nombre étant donné que tu utilises les dicos pour faire tes enregistrements.
    En réalité mes dicos sont stockés dans une liste dont j'ignore la taille par avance étant donné que c'est l'utilisateur du programme qui définit le nombre d'entrées. Enfin bien sur je peux connaitre le nombre de dicos passés en entrée en faisant un len de ma liste.

    Votre exemple m'a aidé, voici ce que j'ai fait, sur un exemple simple j'obtiens le résultat escompté, ça devrait donc marcher avec mes données au bureau.

    Mon premier code était vraiment... bref


    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
    dico_1 = {"toto" : "1", "jean" : "1"}
    dico_2 = {"toto" : "1", "eric" : "1"}
    dico_3={"toto":"1"}
     
    liste_dico=[dico_1,dico_2,dico_3]
     
    test = {}
    for i,dic in enumerate(liste_dico):
    	for cle in dic:
    		if cle in test:
    			test[cle]+=tuple(str(i))
    		elif cle in dic:
    			test[cle]=tuple(str(i))
     
    print test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {'jean': ('0',), 'toto': ('0', '1', '2'), 'eric': ('1',)}

    Vous aurez surement des critiques, car pour stocker les numéros de me dicos je passe par des tuples qui nécessitent un cast, très moche je suppose ? Quoi qu'il en soit cette solution semble me convenir.

    Merci à vous

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut
    Salut,

    Ce que j'ai compris c'est qu'on veut construire un dict dont les clés seront la réunion de toutes les clés et les valeurs la liste des dicos qui les contiennent.
    Ce qui se résume à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    from collections import defaultdict
    md = defaultdict(list)
    for d in L:
        for k in d.keys():
            md[k].append(d)
    for k, v in md.items():
        print ('%s : %s' % (k, ', '.join('%s' % d for d in v)))
    Pourvu qu'on retravaille un peu les dict initiaux histoire qu'ils s'affichent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class my_dico(dict):
        def __init__(self, name, kwds):
            self._name = name
            super(my_dico, self).__init__(kwds)
        def __str__(self):
            return self._name
     
    d1 = my_dico('dico1', {'michel' : '1', 'toto':'1', 'jean':'1'}) 
    d2 = my_dico('dico2', {'michel' : '1', 'toto':'1'})
    d3 = my_dico('dico3', {'michel':'1','eric':'1'})
    L = d1, d2, d3
    Enfin, c'est une idée.
    Cordialement,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 060
    Par défaut
    Je ne comprend pas bien ce que vous souhaitez faire, mais si ça vous convient, c'est l'essentiel

  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
    Merci wiztricks pour votre solution je vais m'en inspirer

    Bonne soirée

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

Discussions similaires

  1. Existe-til une ou plusieures racines?
    Par frechy dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 11/05/2005, 15h10
  2. Réponses: 7
    Dernier message: 15/02/2005, 13h55
  3. comment verifier l'appartenance a une table?
    Par raul83 dans le forum Access
    Réponses: 7
    Dernier message: 11/10/2004, 16h07
  4. [Servlet] Comment utilisé une servlet plusieurs fois ?
    Par gandalf_le_blanc dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 03/06/2004, 14h49
  5. [Optimisation] Que privilégier : une ou plusieurs requêtes ?
    Par Dimitri01 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 25/01/2004, 11h29

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