2016-12-26 51 views
0

python中的一件事讓我非常難過,就是這個錯誤:TypeError: unhashable type比較基於集合的對象作爲屬性| TypeError:難以置信的類型

理想我想有在那裏我只是用的不是列表集的數據結構,所以我可以使用集合運算符是這樣的:

a = {({1,2}, 'alpha'), ({2,3}, 'beta')} 
b = {({1,2}, 'alpha')} 

c = a - b # c = {({2,3}, 'beta')} 

我甚至不能創建一組包含組,因爲我得到的TypeError: unhashable type: set

所以我嘗試使用列表而不是一組。這樣我可以至少分配a和b的值。但再次使用set方法從另一個導致同樣的錯誤。減去一組:

a = [({1,2}, 'alpha'), ({2,3}, 'beta')] 
b = [({1,2}, 'alpha')] 

c = list(set(a) - set(b)) # c = [({2,3}, 'beta')] 

我有一本字典,而不是一個列表,同樣的錯誤嘗試。

問題:如何比較兩個包含某些元素包含集合的串?

或者我認爲根本錯誤/「不pythonic」和錯誤根源於數據結構本身?

感謝您的幫助!

莫夫

+0

對不起,這是一個錯字! – Raggamuffin

+0

對,現在@Slam建議,用'frozenset([1,2])替換'{1,2}''會起作用。 –

回答

3

你能做的唯一的事情就是用frozenset的內部數據(或轉換集,以frozensets如果它來自外部世界),作爲其恰好創造。

沒有來自標準庫的可變數據結構可以被散列(並且可能大部分實現不應該)),並且原因很簡單。如果你會考慮如何在set/list上實現散列,你會得到它;)

+1

'沒有可變數據結構可以被散列'不是真的。你可以在任何類中實現'__hash __(self)'(但你可能不應該這樣做)。 –

+0

是的,好點。 – Slam

2

你只能將不可變(或至少hashable)數據放入set(或作爲字典的鍵)。 set本身並不是不可變的;但frozenset是。

類似的問題在這裏:Why aren't Python sets hashable?

a = {(frozenset((1, 2)), 'alpha'), (frozenset((2, 3)), 'beta')} 
b = {(frozenset((1, 2)), 'alpha')} 

c = a - b 
print(c) # -> {(frozenset({2, 3}), 'beta')} 

這樣做,現在你想要什麼。