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 :

hash- able dict


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut hash- able dict
    Bonjour,

    Quel est le danger à définir hash via id() pour une classe dérivée de dict ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    def __hash__(self): return id(self)
    S'il n'y en pas, pourquoi la classe dict n'est elle pas hashable ?

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    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 062
    Par défaut
    Il me semble pourtant qu'une méthode soit adaptée à ce cas non

    >>> d = {}
    >>> dir(d)
    ['__class__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']

  3. #3
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    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 062
    Par défaut
    J'ai peut-être compris votre question qui est plus proche de l'intérêt de la fonction hash() sur un dictionnaire.

    La fonction hash() n'a pas été véritablement prévu pour être utilisé avec les dictionnaires, mais elle permet de déterminer si un objet peut servir comme clé de dictionnaire ou non.

    Un objet ne peut être utilisé comme clé de dictionnaire que si l'objet est hachable.

    Espérant vous avoir aidé

    Edit : On pourrait l'utiliser de cette manière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> l_1 = ["a", "b", "c"]
    >>> d = {}
    >>> for ind, letter in enumerate(l_1):
    ...     if hash(letter):
    ...         d[letter] = ind
    ...     else:
    ...         raise TypeError
    ... 
    >>> d
    {'a': 0, 'c': 2, 'b': 1}
    Une liste n'étant pas hachable, on peut vérifier qu'une liste ne peut être une clé du dictionnaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> d = {[12, 5]:"a"}
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'list'

  4. #4
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut
    Merci Fred,

    Je croyais avoir déjà vu l'erreur "dict is unhashable" en py2.6 (je n'ai pas Python sous la mai, je vérifierai ce soir). Mais la question est la même pour les listes:

    Quel danger à utiliser id(self) comme clef de hashage pour une liste ? Pourquoi n'est-ce pas le comportement par défaut ?

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    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 062
    Par défaut
    Je croyais avoir déjà vu l'erreur "dict is unhashable" en py2.6 (je n'ai pas Python sous la mai, je vérifierai ce soir). Mais la question est la même pour les listes:
    Si vous avez suivi mon raisonnement, cela veut dire qu'un dictionnaire ne peut être une clé d'un dictionnaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> d = {}
    >>> dic = {d:15, "a":1}
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'dict'
    Quel danger à utiliser id(self) comme clef de hashage pour une liste ? Pourquoi n'est-ce pas le comportement par défaut ?
    Tout simplement parce-que id() retourne une identité, et comme chaque objet (liste, dictionnaire, etc...) en ont une, ce ne sera pas une façon de vérifier que cet objet peut être une clé d'un dictionnaire.

  6. #6
    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,

    Il doit y avoir une raison technique pour laquelle des structures complexes comme une liste ou un dictionnaire ne sont pas hashables.

    Mais... quel pourrait être l'intérêt pratique d'utiliser un dictionnaire ou une liste comme clé (donc hashée) d'un dictionnaire?

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    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 062
    Par défaut
    En fait tout ce qui est "modifiable" ne peut être une clé de dictionnaire.

    Les tuples "non modifiables" peuvent être une clé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> tup = (12,)
    >>> d = {tup:5}
    >>> d
    {(12,): 5}

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

Discussions similaires

  1. [langage] reference et hash complex
    Par mlo dans le forum Langage
    Réponses: 4
    Dernier message: 07/07/2004, 17h46
  2. [langage] hash
    Par giverny dans le forum Langage
    Réponses: 3
    Dernier message: 12/08/2003, 11h27
  3. [langage] probleme avec un hash de hash
    Par planetevoyage dans le forum Langage
    Réponses: 4
    Dernier message: 06/06/2003, 12h55
  4. [langage] Créé un hash dans un fichier...
    Par Smooky dans le forum Langage
    Réponses: 3
    Dernier message: 26/03/2003, 08h49
  5. Tables de hash
    Par miss8 dans le forum C
    Réponses: 2
    Dernier message: 16/11/2002, 17h44

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