unhashable type: 'list'
Python
Erreur courante
Explication
L'erreur `TypeError: unhashable type: 'list'` survient quand vous utilisez un objet **modifiable (mutable)** — une liste, un dictionnaire ou un set — là où Python exige un objet **hachable (hashable)** : comme **clé de dictionnaire**, comme **élément d'un set**, ou dans certaines opérations d'appartenance. Seuls les objets immuables (nombres, chaînes, tuples) peuvent être hachés.
```python
cache = {}
cache[[1, 2]] = "valeur" # une liste ne peut pas être une clé
# TypeError: unhashable type: 'list'
```
Causes courantes
- **Liste utilisée comme clé de dictionnaire**. - **Liste ou set ajouté à un set** (`{[1, 2]}`). - **Liste comme élément d'un autre set** ou dans un `Counter`. - **Dépaquetage** d'une structure imbriquée mal formée.
1. Utilisez un tuple comme clé
Le tuple est immuable, donc hachable :
cache = {}
cache[(1, 2)] = "valeur" # ✅ tuple comme clé
2. Convertissez en frozenset pour un ensemble immuable
groupes = set()
groupes.add(frozenset([1, 2])) # ✅ ensemble hachable
3. Convertissez les listes en tuples avant insertion
vu = set()
for ligne in donnees:
vu.add(tuple(ligne)) # ✅ tuple() rend la liste hachable
Comment prevenir cette erreur
- **Réfléchissez à l'immuabilité** : clés de dictionnaire et éléments de set doivent être immuables.
- **Privilégiez les tuples** pour représenter des clés composées (`(annee, mois)`).
- Référence : [docs.python.org — Objets hachables](https://docs.python.org/fr/3/glossary.html#term-hashable).
Besoin d'aide sur votre projet ?
Besoin d'aide sur un probleme technique ? Decrivez-le pour des recommandations.
Nous contacterQuestions frequentes
Pourquoi une liste n'est-elle pas hachable mais un tuple oui ?
Parce qu'une liste est modifiable : son contenu (et donc son hash) pourrait changer après insertion, ce qui casserait la structure du dictionnaire ou du set. Le tuple, immuable, garde un hash stable.
Comment utiliser une paire de valeurs comme clé ?
Mettez-les dans un tuple : `mon_dict[(x, y)] = ...`. Pour un ensemble d'éléments sans ordre, utilisez `frozenset(...)`.