web-dev-qa-db-fra.com

Python: TypeError: type non compressible: 'liste'

Je ne parviens pas à renseigner un dictionnaire python à partir d'un autre dictionnaire.

Supposons que le dictionnaire "source" possède une chaîne sous forme de clé et une liste d'objets personnalisés par valeur.

Je crée mon dictionnaire cible exactement comme j'ai créé mon dictionnaire "source". Comment est-il possible que cela ne fonctionne pas?

Je reçois

TypeError: unhashable type: 'list'

Code:

aTargetDictionary = {}
for aKey in aSourceDictionary:
    aTargetDictionary[aKey] = []
    aTargetDictionary[aKey].extend(aSourceDictionary[aKey])

L'erreur est sur cette ligne: aTargetDictionary[aKey] = []

53
codeJack

L'erreur que vous avez donnée est due au fait qu'en python, les clés de dictionnaire doivent être des types immuables (si la clé peut changer, il y aura des problèmes) et que list est un type mutable.

Votre erreur indique que vous essayez d'utiliser une liste comme clé de dictionnaire. vous devrez changer votre liste en tuples si vous voulez les mettre comme clés. dans votre dictionnaire.

Selon the python doc :

Les seuls types de valeurs non acceptables en tant que clés sont des valeurs contenant des listes ou des dictionnaires ou d’autres types mutables qui sont comparés par valeur plutôt que par identité d’objet, la raison étant que la mise en œuvre efficace de dictionnaires nécessite que la valeur de hachage de la clé reste constante

46
Cédric Julien

C'est en effet assez étrange.

Si aSourceDictionary était un dictionnaire, je ne pense pas qu'il soit possible que votre code échoue de la manière que vous décrivez.

Cela conduit à deux hypothèses:

  1. Le code que vous utilisez réellement n'est pas identique au code de votre question (peut-être une version antérieure ou ultérieure?)

  2. aSourceDictionary n'est en fait pas un dictionnaire, mais une autre structure (par exemple, une liste).

7
NPE

Selon votre description, les choses ne s'additionnent pas. Si aSourceDictionary est un dictionnaire, votre boucle for doit fonctionner correctement.

>>> source = {'a': [1, 2], 'b': [2, 3]}
>>> target = {}
>>> for key in source:
...   target[key] = []
...   target[key].extend(source[key])
... 
>>> target
{'a': [1, 2], 'b': [2, 3]}
>>> 
5
ronakg

Cela fonctionne très bien: http://codepad.org/5KgO0b1G , votre variable aSourceDictionary peut avoir un autre type de données que dict

aSourceDictionary = { 'abc' : [1,2,3] , 'ccd' : [4,5] }
aTargetDictionary = {}
for aKey in aSourceDictionary:
        aTargetDictionary[aKey] = []
        aTargetDictionary[aKey].extend(aSourceDictionary[aKey])
print aTargetDictionary
2
DhruvPathak