2012-02-07 2 views
2

Je suis novice en python et j'expérimente un peu mais j'ai du mal à faire une liste dans un tuple à utiliser comme clé de dictionnaire. Voici un exemple qui devrait le rendre plus clair:Comment attribuer une liste dans un tuple dans un dictionnaire?

dict_of_lists_values = {} 
dict_of_lists_values[('dog', 'cat')] = 10 
dict_of_lists_values[('dog1', 'cat1')] = 10 
dict_of_lists_values[('dog1', 'cat2')] = 10 
dict_of_lists_values 
{('dog', 'cat'): 10, ('dog1', 'cat2'): 10, ('dog1', 'cat1'): 10} 

Cela fonctionne parfaitement et me permet d'avoir un deux valeurs que je peux utiliser comme clé dans un dictionnaire. Lorsque je tente d'appliquer à une liste, je reçois une erreur: TypeError: unhashable type: 'list'

dict_of_lists_values = {} 
a = [22, 39, 0] 
b = [15, 38, 12] 
dict[(a, b)] = 'please work' 

Sur la base de mon expérience précédente, je pense que si je convertir la liste en une chaîne, il fonctionnerait, mais je veux aussi comme un liste pas une chaîne.

Est-ce possible?

+0

Aussi, désolé si le titre est confus .. J'ai essayé de penser au titre moins confus (et le fait que je suis venu avec cela montre à quel point ce problème est confus :-) – Lostsoul

+2

Cela échoue parce que le hachage d'un tuple est composé de hachages de chaque élément. –

+0

Je pensais qu'il l'a converti comme il l'a fait avec mon premier exemple. Je vais passer en revue mes livres sur les tuples de python ... Merci de clarifier .. – Lostsoul

Répondre

4

Appelez tuple() sur une liste pour créer un tuple avec les éléments de la liste.

1

Les dictionnaires en Python ne peuvent avoir que des clés immuables/modifiables.

Les chaînes, les nombres et les tuples sont immuables, ils peuvent donc être utilisés comme clés de dictionnaire. Les instances ont un __hash__() unique, de sorte qu'elles peuvent également être utilisées. Mais les listes sont modifiables, elles ne peuvent donc pas être utilisées comme des clés.

+1

Homme, j'ai sommeil. J'ai ça en arrière. Merci pour l'édition Russell. –

3

Non. Il n'est pas possible d'utiliser les types list pour les clés de dictionnaire. Toutefois, vous pouvez étendre list, le rendre lavable, puis utiliser ce nouveau type. (Bien que ce soit un peu lourd.)

class hlist(list): 
    def __hash__(self): 
     # Hash it somehow; here, I convert it to a hashable tuple ... and then hash it 
     return hash(tuple(self)) 

l1 = hlist([1,2,3]) 
l2 = hlist([4,5,6]) 

d = { 
    l1:"Hi.", 
    l2:"Hello!" 
} 

S'il vous plaît noter le commentaire de Sven ci-dessous. Les clés mutables sont dangereuses car leur hash devient obsolète si elles sont modifiées.

+1

C'est une très mauvaise idée puisque le hachage change quand la liste change. Si vous utilisez des clés de dictionnaire modifiables, assurez-vous que le hachage ne changera jamais. –

+0

@SvenMarnach Pourquoi ne voudrions-nous pas que le hachage change si la liste change? La question semble rechercher une clé basée sur le contenu, pas une clé basée sur l'identité. Ou est-ce que je vous ai mal compris? – cheeken

+3

Voici un [exemple] (http://ideone.com/1UEdb) pour illustrer le problème. Si le hachage change, l'objet du dictionnaire ne pourra plus trouver la clé puisque sa position à l'intérieur de la table de hachage a été déterminée en utilisant le hachage d'origine. –

Questions connexes