2010-04-19 3 views
7

Ich möchte ein Wörterbuch erstellen, das von Listen indiziert wird. Zum Beispiel sollte mein Wörterbuch aussehen wie:Erstellen Sie ein Wörterbuch in Python, das von Listen indiziert wird

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

Wer weiß, wie man das macht? Wenn ich nur D([1,2,3]) = 1 gebe, wird ein Fehler zurückgegeben.

+10

Dies ist nicht möglich, dict Schlüssel müssen unveränderlich sein. Verwenden Sie stattdessen Tupel. – SilentGhost

+0

Nun, wie würde ich das tun? D ((1,2,3)) = 1 gibt ebenfalls einen Fehler zurück. – Chris

+0

Es sieht so aus, als ob Sie '(...)' verwenden, wenn Sie '[...]' verwenden möchten. 'D [1, 2, 3] = 1 'sollte gut funktionieren. –

Antwort

17

dict Schlüssel müssen hashable sein, die Listen sind nicht becase sie wandelbar sind. Sie können eine Liste ändern, nachdem Sie sie erstellt haben. Stellen Sie sich vor, wie schwierig es wäre, ein Diktat zu behalten, wenn sich die als Schlüssel verwendeten Daten ändern. es macht keinen Sinn. Stellen Sie sich dieses Szenario

und Sie werden sehen, warum Python nicht versucht, Listen als Schlüssel zu unterstützen.

Die offensichtlichste Lösung besteht darin, Tupel anstelle von Listen als Schlüssel zu verwenden.

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

Sie meinen Wörterbuchschlüssel, nicht Tupelschlüssel, im ersten Satz. –

+0

Natürlich. Vielen Dank. –

+0

"versuche ein Diktat zu behalten" => "versuche, ein Diktat gültig zu halten" – doublep

2

Wörterbuchschlüssel können nur hashbare Objekte sein. Wenn Sie den Inhalt einer Liste als Schlüssel haben möchten, können Sie die Liste in ein Tupel umwandeln.

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

Schlüssel müssen * hashable * sein, nicht notwendigerweise * unveränderlich *. Sie können änderbare Werte haben, die zwar haschbar sind (obwohl sie selten nützlich sind) und unveränderliche Werte, die nicht hashbar sind (zum Beispiel Tupel, die nicht hashbare Werte enthalten). –

+0

Danke für den Kommentar, obwohl das gleiche ... war Beispiel für veränderbare und waschbare? – joaquin

+2

Damit ein Objekt vernünftig hashbar ist, sollten sich die Antworten, die es gibt, wenn Sie seinen Hashwert verwenden und einen Gleichheitsvergleich durchführen, niemals ändern. Das tatsächliche Objekt kann sich möglicherweise auf andere Weise ändern. Wenn ich zum Beispiel eine Klasse "Person" zur Definition von Personen hätte, könnte ich einen Identitätsvergleich durchführen, um herauszufinden, ob zwei Personen gleich sind, egal ob ich etwas über eine Person, wie ihr Alter oder ihre Adresse, ändere . Wenn die Änderbarkeit die Berechnung von Gleichheit und Hash nicht beeinflusst, verhindert sie nicht, dass ein Objekt hashbar ist. –

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

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

Wie von anderen erklärt (see also here), können Sie keine Liste direkt verwenden. Sie können jedoch stattdessen die Zeichenfolgendarstellung verwenden, wenn Sie Ihre Liste wirklich verwenden möchten.

Verwandte Themen