2015-02-17 14 views
6

Oczywiście działa, ale czy istnieją przypadki, w których dwa zestawy tych samych elementów powodują dodanie dwóch wpisów w Dict? Domyślam się, że mam ten warunek wcześniej i zmieniłem swój kod z frozenset(...) na tuple(sorted(frozenset(...))). Czy ktoś, kto wie, jak Dict i zamrożone wdrożenie potwierdzić, czy jest to wymagane, czy nie?Czy używanie zestawu zamrożonego jako klucza Dict jest bezpieczne?

+0

To co to przeznaczona. Jeśli masz przykład powodujący problemy, opublikuj go. – interjay

Odpowiedz

6

istnieją przypadki, w których dwa zestawy tych samych elementów zdarzają dodać dwa wpisy w Dict?

Nr frozenset hashing algorithm nie zależy od kolejności elementów, tylko od samych elementów. Dwa FS'es z tych samych elementów są równe i mają równe mieszań, a tym samym zaspokojenie obu kryteriów „tożsamości dict”, innymi słowy, są one takie same klucz DICT:

>>> a = frozenset([1,1,1,1,2,3]) 
>>> b = frozenset([3,3,3,3,2,1]) 
>>> {a:1, b:2} 
{frozenset([1, 2, 3]): 2} 
11

Zgodnie z dokumentami Frozenset ma możliwość zaostrzenia, ponieważ jest niezmienny. Oznaczałoby to, że można go użyć jako klucza do dyktatu, ponieważ warunkiem wstępnym klucza jest to, że jest on nieosiągalny.

Z FrozenSet docs

Typ frozenset jest niezmienna i hashable - jego zawartość nie może być zmieniona po jego utworzeniu; dlatego może być używany jako klucz słownika lub jako element innego zestawu.

I nadmiarowo, z Dictionary docs:

... klucze, które mogą być dowolne niezmienne type


do wyjaśnienia, zestaw (z definicji), zamrożone lub nie, nie zachowuje porządku. Są one przechowywane wewnętrznie, a porządek nie jest brany pod uwagę, a zduplikowane elementy są usuwane, dlatego dwa zestawy zbudowane w różnych zamówieniach byłyby odpowiednikami kluczy w słowniku - są takie same.

>>> frozenset([1,2,2,3,3]) == frozenset([3,2,1,1,1]) 
True 

i podobnie

>>> d = {} 
>>> d[frozenset([1,1,2,3])] = 'hello' 
>>> d[frozenset([1,2,3,3])] 
'hello' 
>>> d[frozenset([3,3,3,2,1,1,1])] 
'hello' 
>>> d[frozenset([2,1,3])] 
'hello' 
+1

Ale pytanie brzmiało, czy Frozensets zbudowany w innej kolejności, ale z tymi samymi ostatecznymi wartościami, mają różne wartości mieszania. Odpowiedź brzmi: nie, nie mają różnych wartości skrótu. – tdelaney

+0

Zakładam, że zostało to zrozumiane, ponieważ zestaw z definicji nie zachowuje porządku. – JohnZ

+0

Użytkownik odpowiedział * tak *, co oznacza, że ​​myślisz, że skróty mogą być różne, więc 'tuple (posortowane (frozenset (...))) jest konieczne. Nie jest to kwestia nietrwałości czy porządku, jest to kwestia wartości hash. – tdelaney

7

z the official docs

typu frozenset jest niezmienna i hashable - jego zawartość nie może być zmieniany po utworzeniu; dlatego może być używany jako klucz słownikowy lub jako element innego zestawu.

(podkreślenie moje)

Powiązane problemy