Getestet mit Python 2.6 Interpreter:
>>> a=set('abcde')
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> l=['f','g']
>>> l
['f', 'g']
>>> a.add(l)
Traceback (most recent call last):
File "<pyshell#35>", line 1, in <module>
a.add(l)
TypeError: list objects are unhashable
Ich denke, dass ich die Liste nicht zum Set hinzufügen kann, da Python nicht erkennen kann, ob ich dieselbe Liste zweimal hinzugefügt habe. Gibt es eine Problemumgehung?
EDIT: Ich möchte die Liste selbst hinzufügen, nicht ihre Elemente.
Antworten:
Sie können einer Gruppe keine Liste hinzufügen, da Listen veränderbar sind. Dies bedeutet, dass Sie den Inhalt der Liste ändern können, nachdem Sie sie der Gruppe hinzugefügt haben.
Sie können dem Set jedoch Tupel hinzufügen, da Sie den Inhalt eines Tupels nicht ändern können:
Bearbeiten : einige Erklärungen: In der Dokumentation wird a
set
als ungeordnete Sammlung unterschiedlicher hashbarer Objekte definiert. Die Objekte müssen hashbar sein, damit das Suchen, Hinzufügen und Entfernen von Elementen bei jeder Ausführung dieser Vorgänge schneller erfolgen kann als das Betrachten jedes einzelnen Elements. Die spezifischen verwendeten Algorithmen werden im Wikipedia-Artikel erläutert . Pythons-Hashing-Algorithmen werden auf effbot.org erklärt und Pythons__hash__
funktionieren in der Python-Referenz .Einige Fakten:
list
:tuple
stattdessen verwendenset
:frozenset
stattdessen verwendendict
: hat kein offizielles Gegenstück, aber es gibt einige Rezeptequelle
collections.namedtuple
könnte als "offizielles" Gegenstück zumdict
.Verwenden Sie
set.update()
oder|=
Bearbeiten: Wenn Sie die Liste selbst und nicht ihre Mitglieder hinzufügen möchten, müssen Sie leider ein Tupel verwenden. Festgelegte Mitglieder müssen hashbar sein .
quelle
|
implementiert Bediener die Vereinigungsoperation . Sowohl der|=
Operator als auch dieset.update()
Methode wenden diese Operation direkt an und sind praktisch synonym. Könnteset_a |= set_b
also als syntaktischer Zucker für beideset_a.update(set_b)
und betrachtet werdenset_a = set_a | set_b
(außer dass im letzteren Fall dasselbeset_a
Objekt wiederverwendet und nicht neu zugewiesen wird).</ahem>
Um die Elemente einer Liste zu einem Satz hinzuzufügen , verwendet
update
Von https://docs.python.org/2/library/sets.html
Z.B
Wenn Sie stattdessen die gesamte Liste als einzelnes Element zum Satz hinzufügen möchten , können Sie dies nicht, da Listen nicht hashbar sind. Sie können stattdessen ein Tupel hinzufügen, z
s.add(tuple(l))
. Weitere Informationen hierzu finden Sie unter TypeError: unhashable type: 'list' bei Verwendung der integrierten Set-Funktion .quelle
Hoffentlich hilft das:
quelle
Bitte beachten Sie die Funktion
set.update()
. Die Dokumentation sagt:quelle
Listenobjekte können nicht verwertet werden . Vielleicht möchten Sie sie jedoch in Tupel umwandeln.
quelle
Sets können keine veränderlichen (veränderbaren) Elemente / Elemente haben. Eine Liste, die veränderlich ist, kann kein Mitglied einer Gruppe sein.
Da Sets veränderlich sind, können Sie keine Sets haben! Sie können jedoch eine Reihe von Frozensets haben.
(Die gleiche Art von "Veränderbarkeitsanforderung" gilt für die Schlüssel eines Diktats.)
Andere Antworten haben Ihnen bereits Code gegeben, ich hoffe, dies gibt ein wenig Einblick. Ich hoffe, Alex Martelli wird mit noch mehr Details antworten.
quelle
Sie möchten ein Tupel hinzufügen, keine Liste:
Wenn Sie eine Liste haben, können Sie wie oben gezeigt in das Tupel konvertieren. Ein Tupel ist unveränderlich und kann daher dem Satz hinzugefügt werden.
quelle
Ich stellte fest, dass ich heute etwas Ähnliches tun musste. Der Algorithmus wusste, wann eine neue Liste erstellt wurde, die dem Satz hinzugefügt werden musste, aber nicht, wann die Bearbeitung der Liste beendet worden wäre.
Wie auch immer, das Verhalten, das ich wollte, war eher für die Verwendung
id
als für das Sethash
. Als solches fand ich,mydict[id(mylist)] = mylist
anstattmyset.add(mylist)
das Verhalten anzubieten, das ich wollte.quelle
Sie sollten Tupel verwenden, die hashbar sind (Sie können ein veränderbares Objekt wie eine Liste nicht hashen).
quelle
So mache ich es normalerweise:
quelle
Dies sollte tun:
quelle