2013-05-17 19 views
7

Wiemy w Pythonie, zestaw może być zdefiniowany przez wypisując wszystkie jego elementy, takie jak ten:W języku Python, jak napisać zestaw zawierający zestaw?

a_set={1,"xyz"} 

i książek Pythona wszyscy mówią elementy zestawu może być dowolny typ danych. Więc powinniśmy być w stanie wypisać zestaw zawierający zestaw. Starałem się napisać jak:

a_set={1,{"xyz"}} 

Ale IDLE zgłosił błąd:

Traceback (most recent call last): 
    File "<pyshell#58>", line 1, in <module> 
    a_set={1,{"xyz"}} 
TypeError: unhashable type: 'set' 

myślę, że może to być spowodowane Python próbuje zrozumieć go jako słownik. Następnie, jak napisać zestaw zawierający zestaw w Pythonie?

+0

możliwe duplikat [dlaczego nie Pythona ustawia hashable] (http://stackoverflow.com/questions/6310867/why-arent-python-sets-hashable) –

+0

Chociaż nie odpowiada bezpośrednio na pytanie, [Dlaczego klucze słownikowe muszą być niezmienne?] (http://docs.python.org/3.3/faq/ design.html # why-must-dictionary-keys-be-immutable) w Pythonie FAQ jest tutaj odpowiednie. Wartości zestawu są w zasadzie takie same jak klucze słownika (oba są przechowywane w tabelach mieszania), więc nie można umieścić zestawu w zestawie z tego samego powodu, dla którego nie można użyć dyktatury jako klucza dyktującego. – abarnert

Odpowiedz

15

Najbardziej wewnętrzne zestawy muszą być typu frozenset, który jest niezmienną wersją zestawu.

>>> a_set = {1, frozenset(['xyz'])} 
>>> a_set 
set([1, frozenset(['xyz'])]) 

Z docs:

class frozenset([iterable])

Return a new set or frozenset object whose elements are taken from iterable. The elements of a set must be hashable. To represent sets of sets, the inner sets must be frozenset objects. If iterable is not specified, a new empty set is returned.

+2

+1. Ale może być jaśniej napisać '{1, frozenset ({'xyz'})}'. – abarnert

+0

Rozumiem. Dziękuję wam wszystkim! – user2384994

+2

Phfff, 6 dodatkowych głosów za pytaniem i 12 za odpowiedź RTFM? Standardy są tutaj dość niskie. – martineau

6

Zestawy można przechowywać tylko obiekty niezmienne, natomiast zestawy są zmienne sami. Tak więc zestaw nie może zawierać innego zestawu.

Używając frozenset:

To represent sets of sets , the inner sets must be frozenset objects.

+1

Warto zauważyć, że ograniczenie polega na tym, że zestawy mogą zawierać jedynie obiekty "zgodne z haseł", które zazwyczaj, ale niekoniecznie są "niezmienne". Na przykład instancje niestandardowych klas, które nie definiują "__hash__" lub "__eq__", są nieosiągalne, ale można je zmutować, przypisując im atrybuty. Jest to dozwolone, ponieważ na zawartość tego obiektu nie ma wpływu jego zawartość, a jedynie jego tożsamość, więc nie zmieni się, jeśli obiekt zostanie zmutowany. Możesz tworzyć obiekty, które są częściowo zmienne i częściowo niezmienne, i użyj niezmiennych części, aby zdefiniować hasz. – Blckknght

1

Przykład ten ilustruje zastosowanie frozenset:

a_set = frozenset([1,2,3]) 
b_set = frozenset([1,3]) 
a_set_copy = frozenset([2,3,1]) 

set_of_sets = set([a_set, b_set, a_set_copy]) 

print set_of_sets 
# set([frozenset([1, 3]), frozenset([1, 2, 3])])