432 Stimmen

Liste zum Set hinzufügen?

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 glaube, dass ich die Liste nicht zum Satz hinzufügen kann, weil Python nicht feststellen kann, ob ich dieselbe Liste zweimal hinzugefügt habe. Gibt es einen Workaround?

EDIT: Ich möchte die Liste selbst hinzufügen, nicht ihre Elemente.

9voto

SilentGhost Punkte 285785

Listenobjekte sind unhashbar . Sie sollten sie allerdings in Tupel umwandeln.

7voto

user135331 Punkte 229

Mengen können keine veränderlichen (veränderbaren) Elemente/Mitglieder haben. Eine Liste, die veränderlich ist, kann nicht Mitglied einer Menge sein.

Da Mengen veränderlich sind, kann man keine Menge von Mengen haben! Sie können jedoch eine Menge von Frozensets haben.

(Die gleiche Art von "Mutabilitätsanforderung" gilt für die Schlüssel eines Diktats).

Andere Antworten haben Ihnen bereits einen Code gegeben, ich hoffe, dies gibt Ihnen einen kleinen Einblick. Ich hoffe, dass Alex Martelli mit noch mehr Details antworten wird.

6voto

Dunes Punkte 34391

Ich habe heute festgestellt, dass ich etwas Ähnliches tun muss. Der Algorithmus wusste, wann er eine neue Liste erstellte, die der Menge hinzugefügt werden musste, aber nicht, wann er die Bearbeitung der Liste beendet hatte.

Wie auch immer, das Verhalten, das ich wollte, war für Set zu verwenden id よりも hash . Als solches fand ich mydict[id(mylist)] = mylist anstelle von myset.add(mylist) das von mir gewünschte Verhalten anzubieten.

5voto

hughdbrown Punkte 45214

Sie wollen ein Tupel hinzufügen, keine Liste:

>>> a=set('abcde')
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> l=['f','g']
>>> l
['f', 'g']
>>> t = tuple(l)
>>> t
('f', 'g')
>>> a.add(t)
>>> a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])

Wenn Sie eine Liste haben, können Sie, wie oben gezeigt, in ein Tupel konvertieren. Ein Tupel ist unveränderlich, so dass es der Menge hinzugefügt werden kann.

4voto

Noah Punkte 19254

Sie werden Tupel verwenden wollen, die hashfähig sind (ein veränderliches Objekt wie eine Liste kann nicht hashfähig sein).

>>> a = set("abcde")
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> t = ('f', 'g')
>>> a.add(t)
>>> a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X