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 :

Attaquer un dictionnaire par les 2 bouts


Sujet :

Python

  1. #1
    Membre confirmé Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Par défaut Attaquer un dictionnaire par les 2 bouts
    Bonjour,

    je voudrais savoir s'il existe un moyen d'attaquer un dictionnaire par les 2 bouts...
    Ou encore : peut accéder aux clefs à partir des valeurs ?
    Bien sûr, cela suppose que les valeurs soient toutes différentes (comme le sont les clefs), mais ça, dans mon cas, je le garantis.

    En fait, mon truc ressemble un peu à une a-liste du Lisp, càd une liste de paires.
    Si je donne la valeur d'un premier élément d'une paire, je récupère le second élément, et réciproquement.

    Merci et bonne semaine à tous

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 069
    Par défaut
    un bricolage pour inverser cles/valeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dict(zip(a.values(),a.keys()))
    sinon fouille dans dir({})

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Par défaut
    Sinon, si tu pars d'une liste de paires:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    liste_de_paires = ((1, 2), (3, 4))
    dico1 = dict(liste_de_paires)
    dico2 = dict((j, i) for (i, j) in liste_de_paires)

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 25
    Par défaut
    Je ne sait pas si c'est ce que tu cherche mais je te propose quelque chose comme ci-dessous mais dans l'exemple d.get(4) : 4 seras toujours considéré comme la clef jamais comme la valeur
    ça n'est pas très fiable.
    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
    18
    19
    20
    21
    22
    23
     
    class dico(dict):
        def __init__(self, name=None):
            dict.__init__(self)
     
        def get(self,val):
            if self.has_key(val) == True:
                return self[val]
            else:
                for k,v in self.iteritems():
                    if v == val:
                        return k
    d = dico()
     
    d['pommes']= 15
    d["fraises"] = 4
    d[4]="Fraises"
     
     
     
    print d.get(15)
    print d.get("pommes")
    print d.get(4)

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 069
    Par défaut
    Citation Envoyé par sopsag Voir le message
    Ou encore : peut accéder aux clefs à partir des valeurs ?
    Bien sûr, cela suppose que les valeurs soient toutes différentes (comme le sont les clefs), mais ça, dans mon cas, je le garantis.
    genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    def extrakt(paires,item):
        flat = sum(paires,())
        return flat[flat.index(item)^1]
     
    paires=( (1,('a',)), ([1,2,3],'x'), (5,'toto') )
    extrakt(paires,'x') #===> [1,2,3]
    extrakt(paires,'toto') #===> 5

  6. #6
    Membre confirmé Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Par défaut
    Merci à tous !

    Secrètement, j'espérais une fonction toute faite du langage, mais si je ne l'ai pas trouvée (et vous non plus) c'est peut être parce qu'il n'y en a pas...

    En tous cas, j'aime beaucoup ta solution josmiley !
    Je pense, que du coup, la meilleure solution pour mon cas, c'est une classe qui contient mon dict sous forme d'une liste à plat et d'utiliser index (avec la ruse du "^1" ).

    encore merci

  7. #7
    Membre chevronné
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Par défaut
    Salut,
    une solution compacte avec des dictionnaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    In [21]:pair = {1:2,3:4,5:6}
    In [22]: dict((v,k) for k,v in pair.iteritems())[6]
    Out[22]: 5
    @josmiley:
    Peux tu expliquer ta fonction, je connais pas l'opérateur que tu utilises.
    Merci.

  8. #8
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 069
    Par défaut
    Citation Envoyé par dahtah Voir le message
    @josmiley:
    Peux tu expliquer ta fonction, je connais pas l'opérateur que tu utilises.
    Merci.
    quel opérateur ? ^ ?
    c'est l'opérateur logique XOR :
    & = AND
    | = OR
    ^ = XOR
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    A   B   out
    0 ^ 0 = 0
    0 ^ 1 = 1
    1 ^ 0 = 1
    1 ^ 1 = 0
    tu vois l'astuce ? on peut s'en servir pour inverser des bits ...

  9. #9
    Membre chevronné
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Par défaut
    Citation Envoyé par josmiley Voir le message
    & = AND
    | = OR
    Je connaissais ceux là
    Citation Envoyé par josmiley Voir le message
    ^ = XOR
    mais pas celui là.
    Citation Envoyé par josmiley Voir le message
    tu vois l'astuce ? on peut s'en servir pour inverser des bits ...
    Je comprends le principe de ton code,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    flat[flat.index(item)^1]
    mais j'ai du mal à voir ce que te sors
    ça marche pas chez moi (python 2.6)
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    In [33]: sum(paires, ())
    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
     
    C:\Documents and Settings\moneger_a\<ipython console> in <module>()
     
    C:\Python26\lib\site-packages\numpy\core\fromnumeric.pyc in sum(a, axis, dtype,
    out)
       1249         sum = a.sum
       1250     except AttributeError:
    -> 1251         return _wrapit(a, 'sum', axis, dtype, out)
       1252     return sum(axis, dtype, out)
       1253
     
    C:\Python26\lib\site-packages\numpy\core\fromnumeric.pyc in _wrapit(obj, method,
     *args, **kwds)
         35     except AttributeError:
         36         wrap = None
    ---> 37     result = getattr(asarray(obj),method)(*args, **kwds)
         38     if wrap:
         39         if not isinstance(result, mu.ndarray):
     
    C:\Python26\lib\site-packages\numpy\core\numeric.pyc in asarray(a, dtype, order)
     
        228
        229     """
    --> 230     return array(a, dtype, copy=False, order=order)
        231
        232 def asanyarray(a, dtype=None, order=None):
     
    ValueError: setting an array element with a sequence
    @sopsag : désolé de polluer ton post

  10. #10
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    bonjour,

    je crois que tu utilises la fonction sum de numpy et non celle de python, ce qui explique le message d'erreur.

    j'aime beaucoup l'astuce:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    flat[flat.index(item)^1]

  11. #11
    Membre chevronné
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Par défaut
    Citation Envoyé par kango Voir le message
    je crois que tu utilises la fonction sum de numpy et non celle de python
    Ah oui, quel c**. Merci.

  12. #12
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    La solution de josmiley est ingénieuse, mais la recherche d'un élément est O(n) en temps; la solution avec les deux dictionnaires utilise plus de mémoire mais sera O(1) en temps (en pratique du moins). S'il y a beaucoup de paires, la solution des dictionnaires sera beaucoup plus rapide!

  13. #13
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 8
    Par défaut
    @sopsag: garantis-tu aussi qu'il n'y a pas d'intersection entre les ensemble des valeurs et des clés ?

    Si oui, autant faire un seul dictionnaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    liste = ((1, "a"), (2, "b"))
    dico_final = dict(liste)
    dico_final.update((val, cle) for (cle, val) in liste)

  14. #14
    Membre confirmé Avatar de sopsag
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 224
    Par défaut
    Oui RaphaelSP, je garantis qu'il n'y a pas intersection, mais tant qu'à faire à doubler la quantité de mémoire, autant faire 2 dictionnaires, les recherches iront plus vite...

    Mon cher dahtah, je suis ravi que des brillants esprits viennent "polluer mon post" ! Je trouve ça très intéressant !

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

Discussions similaires

  1. Intégrer des bouts de scripts envoyés par les visiteurs
    Par thelvin dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 27/06/2013, 11h44
  2. Débogage corrompu par les optimisations du compilateur
    Par petitcoucou31 dans le forum EDI
    Réponses: 6
    Dernier message: 17/12/2003, 00h30
  3. [JVM] Connaitre la taille mémoire utilisé par les dif classe
    Par sur_uix dans le forum Général Java
    Réponses: 4
    Dernier message: 18/09/2003, 09h17
  4. Copies de flots en passant par les itérateurs
    Par Christophe Brun dans le forum C++
    Réponses: 7
    Dernier message: 02/07/2003, 11h41
  5. Afficher une image sans passer par les textures
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/05/2003, 19h13

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