Sie könnten diese Arbeit völlig machen, aber ich wette, Sie würden die Effekte nicht mögen.
from functools import reduce
from operator import xor
class List(list):
def __hash__(self):
return reduce(xor, self)
Nun wollen wir sehen, was passiert:
>>> l = List([23,42,99])
>>> hash(l)
94
>>> d = {l: "Hello"}
>>> d[l]
'Hello'
>>> l.append(7)
>>> d
{[23, 42, 99, 7]: 'Hello'}
>>> l
[23, 42, 99, 7]
>>> d[l]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: [23, 42, 99, 7]
edit: Also dachte ich, das über ein paar mehr. Sie könnten das obige Beispiel funktioniert, wenn Sie die Liste der ID als Hash-Wert zurückgeben:
class List(list):
def __hash__(self):
return id(self)
In diesem Fall d[l]
geben Ihnen 'Hello'
, aber weder d[[23,42,99,7]]
noch d[List([23,42,99,7])]
wird (weil Sie einen neuen sind die Schaffung . [Ll]ist
val, große Erklärung Was machen Sie hier versucht zu sagen:.!? Aus der Ferne glauben Sie, die Frage war, damit schlecht, um einen Downvote zu bekommen? – gsamaras
Ich meine, dass Sie den Schlüssel Ihres Wörterbuchs von außerhalb des Wörterbuchs geändert haben: da hashtables sich auf die 1: 1 (ish) Übereinstimmung von Schlüsseln und Hashes verlassen, ist das Ändern des Schlüssels hinter dem Hash der Rückseite eine sehr schlechte Idee. – val
Sie haben nicht wirklich gesagt, warum das Ändern eines Schlüssels schlecht ist - weil es den Hashwert des Schlüssels ändert, was bedeutet, dass der Ort, an dem das Schlüssel/Wert-Paar gespeichert wird, ungültig wird, was bedeutet, dass Sie das Schlüssel/Wert-Paar nicht abrufen können nicht mehr. Hash-Tabellen arbeiten auch mit einem ∞: 1-Schlüssel für die Hash-Korrespondenz (alle Schlüssel haben den gleichen Hash-Wert). Alles, was bewirkt wird, ist ihre Leistung. – Dunes