Testowane na interprecie języka Python 2.6:
>>> 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
Myślę, że nie mogę dodać listy do zestawu, ponieważ nie ma możliwości, aby Python mógł stwierdzić, czy dodałem tę samą listę dwa razy. Czy jest w pobliżu praca?
EDYCJA: Chcę dodać samą listę, a nie jej elementy.
Odpowiedzi:
Nie można dodać listy do zestawu, ponieważ listy można modyfikować, co oznacza, że można zmienić zawartość listy po dodaniu jej do zestawu.
Możesz jednak dodać krotki do zestawu, ponieważ nie możesz zmienić zawartości krotki:
Edycja : niektóre wyjaśnienia: Dokumentacja definiuje
set
jako nieuporządkowany zbiór różnych obiektów możliwych do skrótu. Obiekty muszą być haszowalne, aby wyszukiwanie, dodawanie i usuwanie elementów odbywało się szybciej niż patrzenie na każdy element za każdym razem, gdy wykonujesz te operacje. Konkretne zastosowane algorytmy wyjaśniono w artykule w Wikipedii . Algorytmy mieszające Pythona są wyjaśnione na stronie effbot.org, a__hash__
funkcja pytonów w odnośniku do Pythona .Kilka faktów:
list
: użyjtuple
zamiast tegoset
: użyjfrozenset
zamiast tegodict
: nie ma oficjalnego odpowiednika, ale istnieją pewne przepisyźródło
collections.namedtuple
może być uważany za „oficjalny” odpowiednikdict
.Użyj
set.update()
lub|=
edycja: Jeśli chcesz dodać samą listę, a nie jej członków, musisz niestety użyć krotki. Członkowie zestawu muszą mieć funkcję skrótu .
źródło
|
operator realizuje operację łączenia zestawów . Zarówno|=
operator, jak iset.update()
metoda stosują tę operację w miejscu i są skutecznie synonimami. Tak więc,set_a |= set_b
można uznać zarówno za cukier syntaktycznyset_a.update(set_b)
iset_a = set_a | set_b
(chyba że w tym ostatnim przypadku, ten samset_a
obiekt jest wykorzystywany zamiast przeniesiony).</ahem>
Aby dodać elementy listy do zestawu , użyj
update
Od https://docs.python.org/2/library/sets.html
Na przykład
Jeśli zamiast tego chcesz dodać całą listę jako pojedynczy element do zestawu, nie możesz tego zrobić, ponieważ listy nie są mieszalne. Zamiast tego możesz dodać krotkę, np
s.add(tuple(l))
. Zobacz także TypeError: unhashable type: 'list', gdy używasz wbudowanej funkcji set, aby uzyskać więcej informacji na ten temat.źródło
Mam nadzieję, że to pomaga:
źródło
Proszę zwrócić uwagę na funkcję
set.update()
. Dokumentacja mówi:źródło
obiektów listy nie da się zhashować . jednak możesz je zamienić na krotki.
źródło
Zestawy nie mogą mieć zmiennych / zmiennych elementów / elementów. Zmodyfikowana lista nie może być członkiem zestawu.
Ponieważ zestawy są zmienne, nie możesz mieć zestawu zestawów! Możesz jednak mieć zestaw frozensetów.
(Ten sam rodzaj „wymogu zmienności” dotyczy kluczy dykta).
Inne odpowiedzi już dały ci kod, mam nadzieję, że daje to trochę wglądu. Mam nadzieję, że Alex Martelli odpowie jeszcze bardziej szczegółami.
źródło
Chcesz dodać krotkę, a nie listę:
Jeśli masz listę, możesz przekonwertować na krotkę, jak pokazano powyżej. Krotka jest niezmienna, więc można ją dodać do zestawu.
źródło
Odkryłem, że muszę dziś zrobić coś podobnego. Algorytm wiedział, kiedy tworzy nową listę, którą należy dodać do zestawu, ale nie wie, kiedy przestanie działać na liście.
W każdym razie zachowanie, którego chciałem, było
id
raczej zgodne z zestawemhash
. Jako taki znalazłemmydict[id(mylist)] = mylist
zamiastmyset.add(mylist)
oferować zachowanie, które chciałem.źródło
Będziesz chciał użyć krotek, które są haszowalne (nie możesz haszować zmiennego obiektu, takiego jak lista).
źródło
Oto jak zwykle to robię:
źródło
To powinno zrobić:
źródło