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

921voto

aehlke Punkte 14161

Verwenden Sie set.update() ou |=

>>> a = set('abc')
>>> l = ['d', 'e']
>>> a.update(l)
>>> a
{'e', 'b', 'c', 'd', 'a'}

>>> l = ['f', 'g']
>>> a |= set(l)
>>> a
{'e', 'b', 'f', 'c', 'd', 'g', 'a'}

edit: Wenn Sie die Liste selbst hinzufügen wollen und nicht ihre Mitglieder, dann müssen Sie leider ein Tupel verwenden. Set-Mitglieder müssen sein Hashable .

253voto

Otto Allmendinger Punkte 26430

Sie können eine Liste nicht zu einer Menge hinzufügen, da Listen veränderbar sind, d. h. Sie können den Inhalt der Liste ändern, nachdem Sie sie der Menge hinzugefügt haben.

Sie können jedoch Tupel zu der Menge hinzufügen, da Sie den Inhalt eines Tupels nicht ändern können:

>>> a.add(('f', 'g'))
>>> print a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])

bearbeiten : eine Erklärung: Die Dokumentation definiert eine set como eine ungeordnete Sammlung von eindeutigen Hash-Objekten. Die Objekte müssen hashfähig sein, damit das Auffinden, Hinzufügen und Entfernen von Elementen schneller geht, als wenn man sich jedes einzelne Element ansieht, wenn man diese Operationen durchführt. Die verwendeten Algorithmen werden im Abschnitt Wikipedia-Artikel . Pythons Hashing-Algorithmen werden erklärt unter effbot.org und Pythons __hash__ Funktion in der Python-Referenz .

Einige Fakten:

  • Elemente setzen wie auch Wörterbuchschlüssel müssen hashfähig sein
  • Einige unhashable Datentypen:
    • list : verwenden tuple stattdessen
    • set : verwenden frozenset stattdessen
    • dict : hat kein offizielles Gegenstück, aber es gibt einige Rezepte
  • Objektinstanzen sind standardmäßig hashfähig, wobei jede Instanz einen eindeutigen Hash hat. Sie können dieses Verhalten außer Kraft setzen, wie in der Python-Referenz erläutert.

98voto

JDiMatteo Punkte 10224

An die Elemente einer Liste zu einer Menge hinzufügen verwenden update

De https://docs.python.org/2/library/sets.html

s.update(t): Rückgabe der Menge s mit den von t hinzugefügten Elementen

z.B.

>>> s = set([1, 2])
>>> l = [3, 4]
>>> s.update(l)
>>> s
{1, 2, 3, 4}

Wenn Sie stattdessen die gesamte Liste als ein einziges Element hinzufügen zu der Menge hinzuzufügen, ist nicht möglich, da Listen nicht hashfähig sind. Sie könnten stattdessen ein Tupel hinzufügen, z. B. s.add(tuple(l)) . Siehe auch TypeError: unhashable type: 'list' bei Verwendung der eingebauten set-Funktion für weitere Informationen zu diesem Thema.

46voto

alvas Punkte 104216

Hoffentlich hilft das:

>>> seta = set('1234')
>>> listb = ['a','b','c']
>>> seta.union(listb)
set(['a', 'c', 'b', '1', '3', '2', '4'])
>>> seta
set(['1', '3', '2', '4'])
>>> seta = seta.union(listb)
>>> seta
set(['a', 'c', 'b', '1', '3', '2', '4'])

17voto

eggfly Punkte 171

Bitte beachten Sie die Funktion set.update() . In der Dokumentation steht:

Aktualisieren einer Menge mit der Vereinigung von sich selbst und anderen.

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