125 votes

Pourquoi ne puis-je pas utiliser une liste en tant que clé dict en python?

Je suis un peu confus au sujet de ce qui peut/ne peut pas être utilisé comme une clé pour un python dict.

dicked = {}
dicked[None] = 'foo'     # None ok
dicked[(1,3)] = 'baz'    # tuple ok
import sys
dicked[sys] = 'bar'      # wow, even a module is ok !
dicked[(1,[3])] = 'qux'  # oops, not allowed

Donc un n-uplet est immuable type, mais si je me cache dans une liste à l'intérieur de lui, il ne peut pas être une clé.. je n'ai pas pu tout aussi facilement masquer une liste à l'intérieur d'un module?

J'avais une vague idée que la clé est d'être "hashable" mais je vais avouer mon ignorance sur les détails techniques, je ne sais pas ce qui se passe vraiment ici. Ce serait aller mal si vous avez essayé d'utiliser des listes de clés, avec le hash comme, pour ainsi dire, de leur emplacement de mémoire?

48voto

delnan Points 52260

Il y a un bon article sur le sujet dans le wiki Python: Pourquoi les Listes ne Peuvent pas Être les Clés de Dictionnaire. Comme expliqué là:

Ce serait aller mal si vous avez essayé d'utiliser des listes de clés, avec le hash comme, pour ainsi dire, de leur emplacement de mémoire?

Il peut être fait sans vraiment briser toutes les exigences, mais elle conduit à un comportement inattendu. Les listes sont généralement traitées comme si leur valeur a été dérivée à partir de leur contenu, les valeurs, par exemple lors de la vérification (in-)égalité. Beaucoup - à juste titre - s'attendre à ce que vous pouvez utiliser n'importe quelle liste [1, 2] pour obtenir la même clé, où vous auriez à garder autour d'exactement la même liste d'objet. Mais la recherche par la valeur des pauses dès que une liste utilisée comme clé est modifiée, et pour la recherche par identité vous oblige à garder autour d'exactement la même liste, ce qui n'est pas exige pour toute autre commune de la liste de l'opération (au moins aucun que je pense).

D'autres objets tels que les modules et object faire une affaire beaucoup plus importante de leur identité d'objet, de toute façon (quand remonte la dernière fois vous aviez deux distincts module d'objets appelés sys?), et sont comparés par ce que de toute façon. Par conséquent, il est moins étonnant - ou même devraient - ils, lorsqu'il est utilisé comme dict clés, de comparer, par groupe d'identité dans ce cas.

44voto

Remi Points 4223

Pourquoi ne puis-je pas utiliser une liste en tant que clé dict en python?

 >>> d = {repr([1,2,3]): 'value'}
{'[1, 2, 3]': 'value'}
 

(pour quiconque trébuche sur cette question cherchant un moyen de la contourner)

comme expliqué par d'autres ici, en effet vous ne pouvez pas. Vous pouvez cependant utiliser sa représentation sous forme de chaîne si vous voulez vraiment utiliser votre liste.

18voto

Eric Wilson Points 8494

Le problème est que les tuples sont immuables, et les listes ne sont pas. Considérez les points suivants

d = {}
li = [1,2,3]
d[li] = 5
li.append(4)

Que devrait - d[li] de retour? Est-ce la même liste? Que diriez - d[[1,2,3]]? Il a les mêmes valeurs, mais c'est une autre liste?

En fin de compte, il n'y a pas de réponse satisfaisante. Par exemple, si la seule touche qui fonctionne est la clé d'origine, alors si vous n'avez pas de référence à cette clé, vous ne pourrez plus jamais accéder à la valeur. Avec tous les autres permis de clé, vous pouvez construire une clé sans une référence à l'original.

Si deux de mes suggestions de travail, alors vous avez très différents clés qui renvoient la même valeur, ce qui est plus que un peu surprenant. Si seulement le contenu original de travail, votre clé sera vite aller mal, comme les listes sont faites pour être modifiées.

9voto

bpgergo Points 9407

Voici une réponse http://wiki.python.org/moin/DictionaryKeys

Ce serait aller mal si vous avez essayé d'utiliser des listes de clés, avec le hash comme, pour ainsi dire, de leur emplacement de mémoire?

Recherche de listes différentes avec le même contenu serait de produire des résultats différents, même si la comparaison des listes avec le même contenu indiquerait comme équivalent.

Que penser de l'Utilisation d'une liste littérale dans une recherche dans le dictionnaire?

3voto

AKjsd89 Points 43

Votre awnser peuvent être trouvés ici:

Pourquoi les Listes ne Peuvent pas Être les Clés de Dictionnaire

Les nouveaux arrivants à Python me demande souvent pourquoi, alors que la langue comprend à la fois un n-uplet et un type de liste, les tuples sont utilisables en tant que clés de dictionnaire, tandis que les listes ne sont pas. C'était une volonté délibérée de décision de conception, et peut-être mieux expliquée par le premier comprendre comment les dictionnaires Python travail.

Source & plus d'infos: http://wiki.python.org/moin/DictionaryKeys

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X