2010-04-19 14 views
7

Vorrei creare un dizionario che è indicizzato dagli elenchi. Ad esempio, il mio dizionario dovrebbe essere:Creare un dizionario in python che è indicizzato dagli elenchi

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

Qualcuno sa come fare? Se digito semplicemente D([1,2,3]) = 1 restituisce un errore. chiavi

+10

non è possibile, le chiavi dict devono essere immutabili. usa invece le tuple. – SilentGhost

+0

Beh, come potrei farlo? D ((1,2,3)) = 1 restituisce anche un errore. – Chris

+0

Sembra che tu stia usando '(...)' quando intendi usare '[...]'. 'D [1, 2, 3] = 1' dovrebbe funzionare bene. –

risposta

17

dict devono essere hashable, che le liste non sono becase sono mutabili. Puoi cambiare una lista dopo averla fatta. Pensa a quanto sarebbe difficile provare a mantenere una dict quando i dati usati come chiavi cambiano; non ha alcun senso. Immaginate questo scenario

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

e vedrete perché Python non tenta di supportare elenchi come chiavi.

La soluzione più ovvia è utilizzare tuple anziché elenchi come chiavi.

>>> 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

Significa che i tasti del dizionario, non le chiavi di tupla, nella prima frase. –

+0

Ovviamente. Grazie. –

+0

"prova a mantenere un dict" => "prova a mantenere un dict valido" – doublep

2

Le chiavi del dizionario possono essere solo oggetti lavabili. Se si desidera che il contenuto di un elenco sia una chiave, è possibile convertire l'elenco in una tupla.

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

Le chiavi devono essere * lavabili *, non necessariamente * immutabili *. Puoi avere valori mutabili che sono lavabili (anche se raramente utili) e valori immutabili che non sono lavabili (ad esempio, tuple che contengono valori non selezionabili.) –

+0

Grazie per il commento, anche se era la stessa cosa ... potresti dare un esempio di mutabile e lavabile? – joaquin

+2

Affinché un oggetto sia saggiamente lavabile, le risposte che dà quando si prende il suo hash e si fa un confronto di uguaglianza non dovrebbero mai cambiare. L'oggetto reale potrebbe essere in grado di cambiare in altri modi. Per esempio, se avessi una classe 'Person' per definire le persone, potrei essere in grado di usare il confronto dell'identità per scoprire se due oggetti' Person' sono uguali, non importa se cambio cose su un 'Person', come la loro età o indirizzo . Se la mutabilità non influisce sul calcolo dell'eguaglianza e dell'hash, non mantiene un oggetto dall'essere lavabile. –

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

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

Come spiegato da altri (see also here), non è possibile utilizzare direttamente una lista. Puoi comunque usare la sua rappresentazione di stringhe se vuoi davvero usare la tua lista.

Problemi correlati