2010-04-19 17 views
7

Me gustaría crear un diccionario indexado por listas. Por ejemplo, mi diccionario debería verse así:Crear un diccionario en python indexado por listas

D = {[1,2,3]:1, [2,3]:3} 

¿Alguien sabe cómo hacer esto? Si acabo de escribir D([1,2,3]) = 1, devuelve un error. llaves

+10

que no es posible, las claves dict deben ser inmutables. usa tuplas en su lugar. – SilentGhost

+0

Bueno, ¿cómo podría hacer eso? D ((1,2,3)) = 1 también devuelve un error. – Chris

+0

Parece que está usando '(...)' cuando quiere usar '[...]'. 'D [1, 2, 3] = 1' debería funcionar bien. –

Respuesta

17

dict deben ser hashable, que las listas no son becase que son mutables . Puede cambiar una lista después de hacerla. Piense en lo difícil que sería tratar de mantener un dict cuando los datos utilizados como claves cambian; no tiene ningún sentido. Imagine este escenario

>>> foo = [1, 2] 
>>> bar = {foo: 3} 
>>> foo.append(4) 

y verá por qué Python no intenta admitir listas como claves.

La solución más obvia es usar tuplas en lugar de listas como claves.

>>> d = {[1, 2, 3]: 1, [2, 3]: 3} 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unhashable type: 'list' 
>>> d = {(1, 2, 3): 1, (2, 3): 3} 
>>> d 
{(2, 3): 3, (1, 2, 3): 1} 
>>> d[2, 3] 
3 
+0

Te refieres a las teclas del diccionario, no a las tuplas, en la primera oración. –

+0

Por supuesto. Gracias. –

+0

"intenta mantener un dict" => "intenta mantener un dict válido" – doublep

2

Las teclas del diccionario solo pueden ser objetos con posibilidad de manipulación. Si quiere el contenido de una lista como clave, puede convertir la lista en una tupla.

>>>d={} 
>>>a = tuple((1,2)) 
>>>a 
(1, 2) 
>>>d[a] = 3 
>>>print d 
{(1, 2): 3} 
+3

Las llaves deben ser * * lavables *, no necesariamente * inmutables *. Puede tener valores variables que sean fáciles de manipular (aunque raramente es útil) y valores inmutables que no son aptos para el hash (por ejemplo, tuplas que contienen valores que no se puedan aplicar). –

+0

Gracias por el comentario, aunque era lo mismo ... ¿podría darnos un ejemplo de mutable y hashable? – joaquin

+2

Para que un objeto sea perfectamente manejable, las respuestas que da cuando toma su hash y hace una comparación de igualdad nunca deberían cambiar. El objeto real puede cambiar de otras maneras. Por ejemplo, si tuviera una 'Persona' de clase para definir personas, podría usar la comparación de identidad para encontrar si dos objetos 'Persona' son iguales sin importar si cambio cosas sobre una' Persona', como su edad o dirección . Si la mutabilidad no afecta el cálculo de igualdad y hash, no impide que un objeto sea hashable. –

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

{'[1, 2, 3]': 'value'} 

Como se explica por otros (see also here), no se puede utilizar una lista directamente. Sin embargo, puede utilizar su representación de cadena si realmente desea usar su lista.

Cuestiones relacionadas