Partage
  • Partager sur Facebook
  • Partager sur Twitter

[aide] TypeError : unhashable type: "list"

Que peut on mettre dans un dictionnaire

Sujet résolu
    4 juillet 2013 à 11:23:58

    Bonjour.

    je suis en train de faire l'exo sur les caches et je me retrouve bloqué a une exception

    def cache(fonction):
    	dico={}
    	def nouvelle_fonction(*arg,**kwarg):
    		liste=[]
    		liste.append(list(arg))
    		liste.append([(cle,valeur) for cle, valeur in kwarg.items()])
    		if liste in dico:
    			print(dico[liste])
    		else:
    			dico[liste]=fonction(arg,kwarg)
    			print(dico[liste])
    	return nouvelle_fonction
    
    
    @cache
    def alea(nb):
    	liste=[]
    	for i in range(nb):
    		liste.append(randint(0,1000))
    	return liste

    tout va bien jusqu'a ce que j'appelle alea:

    alea(1000)
    Traceback (most recent call last):
      File "<pyshell#0>", line 1, in <module>
        alea(1000)
      File "C:\Python33\cache.py", line 7, in nouvelle_fonction
        if liste in dico:
    TypeError: unhashable type: 'list'

    a ce que j'ai compris le dictionnaire n'accepte que des objets "hashable" comme valeur or la variable "liste" ne contient que des listes et des tuples, et j'ai beau vouloir changer les types (set,list,tuple) rien ne marche. Y a t'il une raison à cette exception ?

    Merci d'avance pour vos reponses


    • Partager sur Facebook
    • Partager sur Twitter
    Si c'était facile, tout le monde le ferait.
      4 juillet 2013 à 13:32:40

      Bonjour,

      Tu peux créer un tuple à partir de ta liste:

      a = [1, 2, 3]
      
      print tuple(a)

      Pas vérifié ton code par contre

      EDIT : après vérification, c'est quelque chose de ce genre que tu souhaites?

      def cache(fonction):
          dico={}
          def nouvelle_fonction(*args,**kwargs):
              liste=[]
              liste.extend(args)
              liste.extend([(cle,valeur) for cle, valeur in kwargs])
              arg_tuple = tuple(liste)
              return dico.setdefault(arg_tuple, fonction(*args, **kwargs))
          return nouvelle_fonction






      -
      Edité par Ntcha 4 juillet 2013 à 13:59:33

      • Partager sur Facebook
      • Partager sur Twitter
        4 juillet 2013 à 14:05:39

        j'ai deja essayé et ca ne marche pas non plus :( (meme erreur)
        • Partager sur Facebook
        • Partager sur Twitter
        Si c'était facile, tout le monde le ferait.
          4 juillet 2013 à 14:31:34

          #Python 2.7
          import random
          
          def cache(fonction):
              dico={}
              def nouvelle_fonction(*args,**kwargs):
                  liste=[]
                  liste.extend(args)
                  liste.extend([(cle,valeur) for cle, valeur in kwargs])
                  arg_tuple = tuple(liste)
                  print 'Cache : ', dico
                  return dico.setdefault(arg_tuple, fonction(*args, **kwargs))
              return nouvelle_fonction
           
           
          @cache
          def alea(nb):
              liste=[]
              for i in range(nb):
                  liste.append(random.randint(0,1000))
              return liste
              
          print alea(5)
          print alea(6)
          print alea(5) 
          #Python 3
          def cache(fonction):
              dico={}
              def nouvelle_fonction(*args,**kwargs):
                  liste=[]
                  liste.extend(args)
                  liste.extend([(cle,valeur) for cle, valeur in kwargs])
                  arg_tuple = tuple(liste)
                  print('Cache : ', dico)
                  return dico.setdefault(arg_tuple, fonction(*args, **kwargs))
              return nouvelle_fonction
           
           
          @cache
          def alea(nb):
              liste=[]
              for i in range(nb):
                  liste.append(random.randint(0,1000))
              return liste
              
          print(alea(5))
          print(alea(6))
          print(alea(5))



          Les deux fonctionnent sans erreur chez moi

          -
          Edité par Ntcha 4 juillet 2013 à 14:32:22

          • Partager sur Facebook
          • Partager sur Twitter
            4 juillet 2013 à 14:46:01

            ok merci beaucoup Ntcha ;)
            • Partager sur Facebook
            • Partager sur Twitter
            Si c'était facile, tout le monde le ferait.

            [aide] TypeError : unhashable type: "list"

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown