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 :

Dictionnaire multi clefs [Python 2.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut Dictionnaire multi clefs
    Bonjour

    J'ai un petit souci et apparemment, une des solutions que j'entrevois serait un "dictionnaire multi-clefs".

    Le principe serait le suivant: un dictionnaire où chaque item serait référencé par plusieurs clefs mais où une seule des clefs suffirait à accéder à l'item

    Un exemple (dans une pseudo-syntaxe)
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> dico={ ("Arthur", "Rimbaud") : 123, ("Jean", "Valjean") : 456}
    >>> print dico["Arthur"]
    123
    >>> print dico["Rimbaud"]
    123
    >>> print dico["Jean"]
    456
    >>> print dico["Valjean"]
    456

    Pourquoi cette solution: il s'agit du QTabWidget de PyQt. Cet élément référence ses widgets par l'index de la widget dans le QTab (0, 1, 2, 3, ...) alors que moi, je référence mes widgets par un mot clef (wid["papa"], wid["maman"], etc.)
    Je pourrais certes référencer mes widgets de façon numérique mais ce serait moins parlant dans le code. Donc pour l'instant je reste avec mon dico de widgets mais quand je veux établir une équivalence entre la widget "papa" et son index dans le QTab, je suis obligé de passer par un mécanisme de calcul à partir d'une liste initiale de mes éléments ("papa", "maman", etc) d'où je ressors l'index. Donc ça fonctionne mais je m'interrogeais sur cette hypothétique notion de dico muti-clefs savoir si 1) ça a déjà été envisagé et 2) si ça allègerais mon code...

    Voilà - Merci de votre attention
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  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,

    A mon avis, ça n'existe pas, mais ça me semble possible.

    Avant la version 2.7 de Python, j'étais irrité par le fait que l'affichage d'un dictionnaire ne conservait pas l'ordre d'insertion des clés (les clés étant rangées dans l'ordre des hash).

    Alors je me suis fabriqué un type dict à moi qui héritait de dict et qui ajoutait ce qui manquait. Le résultat se trouve ici: http://python.jpvweb.com/mesrecettes...tionnaire_ordo.

    Depuis, bien sûr, j'utilise plutôt OrderedDict du module collections, mais ça peut te donner une idée de ce qu'on peut faire de cette façon.

    Il faut, bien sûr, traiter le cas de l'affectation: si l'une des clés change de valeur, il faut que les autres clés du même tuple soit réaffectées à la même valeur. Etc...

    Bonne chance!

  3. #3
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Tu sous-classes et tu y implémentes un dictionnaire tab_name et une méthode setCurrentTab()

    Dans le genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        def addTab(self, widget, name):
            # self est le QTabWidget
            self.tab_name[name] = self.count()
            super(MyTab, self).addTab(widget, name)
     
        def setCurrentTab(self, name):
            self.setCurrentIndex(self.tab_name[name])

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Par défaut
    Bonjour,

    Si on en reste à l'idée du dictionnaire multi-clefs, pourquoi ne pas plutôt utiliser un dictionnaire à clés sur pointage unique ?

    Plutôt que de stocker des variables immutables utiliser des objets/types mutables.

    Dans l'idée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    objet_1 = [128, ]
    objet_2 = [456, ]
    dico = {"Arthur": objet_1, "Rimbaud": objet_1, "Jean": objet_2, "Valjean": objet_2}
     
    assert dico["Arthur"][0] == dico["Rimbaud"][0] == 128
    dico["Arthur"][0] = 129
    assert dico["Arthur"][0] == dico["Rimbaud"][0] == 129
    assert id(dico["Arthur"]) == id(dico["Rimbaud"]) == id(objet_1)
     
    assert dico["Jean"][0] == dico["Valjean"][0] == 456
    assert id(dico["Jean"]) == id(dico["Valjean"]) == id(objet_2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    objet_1 = [128, ]
    dico = dict( zip(["key1", "key2", "key3"], 3 * [objet_1, ]) )
    assert dico["key1"][0] == dico["key2"][0] == dico["key3"][0] == 128
    dico["key1"][0] = 129
    assert dico["key1"][0] == dico["key2"][0] == dico["key3"][0] == 129
    Et on peut facilement casser la dépendance d'un objet sur une clé:
    Je suppose qu'en réécrivant la classe dict on peut s’affranchir de la syntaxe de la liste, et il y a fort à parier qu'un module existe déjà dans cette idée.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 752
    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 752
    Par défaut
    Salut,

    Une telle chose existe sur PyPi : multi key dict..

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Avant la version 2.7 de Python, j'étais irrité par le fait que l'affichage d'un dictionnaire ne conservait pas l'ordre d'insertion des clés
    Oui moi aussi. Souvent je me dis "fais gaffe, tu n'es pas certain d'avoir le résultat dans l'ordre que tu attends" et ça me gonfle...

    Citation Envoyé par tyrtamos Voir le message
    Alors je me suis fabriqué un type dict à moi ... ici: http://python.jpvweb.com/mesrecettes...tionnaire_ordo.
    J'y vais souvent


    Citation Envoyé par VinsS Voir le message
    Salut,

    Tu sous-classes et tu y implémentes un dictionnaire tab_name et une méthode setCurrentTab()

    Dans le genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        def addTab(self, widget, name):
            # self est le QTabWidget
            self.tab_name[name] = self.count()
            super(MyTab, self).addTab(widget, name)
     
        def setCurrentTab(self, name):
            self.setCurrentIndex(self.tab_name[name])
    Joli
    Mais je pense alors qu'au lieu de cloner toutes les méthodes utilisant l'index pour en faire autant utilisant à la place le nom (il y en a beaucoup), je vais plutôt en faire une seule qui renvoie l'index à partir du nom. Bref refaire ce que je fais déjà mais l'encapsuler dans l'objet.

    Merci de tes conseils


    Citation Envoyé par YCL-1 Voir le message
    Si on en reste à l'idée du dictionnaire multi-clefs, pourquoi ne pas plutôt utiliser un dictionnaire à clés sur pointage unique ?
    Très brillant
    J''aurais sans-doute étudié cette idée si wiztricks ne m'avait pas apporté un truc déjà tout fait. Comme quoi c'est fou, on se dit "tiens, je pense que ce truc serait utile" et on se rend compte qu'en fait c'était vraiment utile et aussi que le truc a été fait...

    Citation Envoyé par wiztricks Voir le message
    Une telle chose existe sur PyPi : multi key dict..
    Tout simplement

    Merci à tous. Désolé pour ceux qui n'ont pas été sélectionnés
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Créer un dictionnaire multi langues sur Excel
    Par Bob2323 dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 15/07/2015, 11h37
  2. Dictionnaire à 2 clef
    Par anthyme dans le forum Framework .NET
    Réponses: 16
    Dernier message: 17/02/2009, 10h19
  3. Réponses: 10
    Dernier message: 26/10/2007, 13h55
  4. Réponses: 2
    Dernier message: 13/10/2006, 23h35

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