TypeError: Nicht hashbarer Typ
Ich versuche zu bekommen eine Liste von Tupeln : so etwas wie [ [(1,0),(2,0),(3,0)],[(1,1),(2,1),(3,1)....]]
Ich habe diese Aussage
set([(a,b)for a in range(3)]for b in range(3))
Aber es gibt mir eine Fehlermeldung
TypeError: unhashable type: 'list'
Ich habe 2 Fragen für die Python Guru:
a) Wenn ich einen Blick in die Python-definition von Hashable -
"Ein Objekt ist hashable, wenn es einen hash-Wert ändert sich nie während seiner Lebenszeit (es muss ein hash () - Methode)"
wenn ich dir Funktion auf dem Ausdruck oben
dir([(a,b)for a in range(3)]for b in range(3))
scheint es zu sagen, dass die __hash__
ist es. Also, warum bekomme ich die Fehlermeldung?
War ich in der Lage zu bekommen [[(0, 0), (1, 0), (2, 0)], [(0, 1), (1, 1), (2, 1)], [(0, 2), (1, 2), (2, 2)]]
mit dem list-Befehl :
list(list((a,b) for a in range(3)) for bin range(3))
b)Liste aus, und legen beide nimmt Iterierbar als parameter. Wie kommt man arbeitet(Liste) und andere nicht (festgelegt)?
InformationsquelleAutor der Frage pylearner | 2011-07-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erstellen Sie eine
set
überset(...)
nennen, undset
muss hashable Elemente. Sie können nicht haben eine Menge der Listen. Weil die Liste ist nicht hashable.[[(a,b) for a in range(3)] for b in range(3)]
ist eine Liste. Es ist nicht eine hashable geben. Die__hash__
Sie sah in dir(...) ist nicht eine Methode, es ist nur Keine.Einer Liste Verständnis gibt eine Liste, Sie brauchen nicht explizit Liste gibt, nur verwenden:
Versuchen Sie, diese:
InformationsquelleAutor der Antwort utdemir
Liste ist unhashable, weil seine Inhalte ändern kann über seine Lebensdauer. Sie können aktualisieren Sie ein Element in der Liste enthalten ist jederzeit möglich.
Eine Liste nicht verwenden Sie einen hash, der für die Indizierung, damit es nicht eingeschränkt zu hashable Elemente.
InformationsquelleAutor der Antwort Mark Ransom
Den real Grund, weil
set
nicht funktioniert, ist die Tatsache, dass es verwendet die hash Funktion zu unterscheiden, die unterschiedliche Werte haben. Dies bedeutet, dass sets nur erlaubt hashable Objekte. Warum eine Liste ist nicht hashable ist bereits hingewiesen.InformationsquelleAutor der Antwort schlamar
... und so sollten Sie so etwas tun:
... und wenn nötig wieder zurück konvertieren zu-Liste
InformationsquelleAutor der Antwort fransua
Für diejenigen, die von der Google-Suche nach einer einfachen Antwort: es funktioniert mit den Tupeln, aber nicht mit Listen beim erstellen eines Satzes.
InformationsquelleAutor der Antwort Guillaume Chevalier
Werden Sie feststellen, dass Instanzen von
list
nicht__hash__
--eher, dass die attribute der einzelnen Listen ist eigentlichNone
(versuchenprint [].__hash__
). Solist
ist unhashable.Den Grund, warum Ihr code funktioniert mit
list
und nichtset
ist, weilset
Konstrukte eine einzelne Gruppe von Elementen ohne Duplikate, in der Erwägung, dass eine Liste können beliebige Daten.InformationsquelleAutor der Antwort multipleinterfaces