2013-02-07 81 views
1

我想運行一個程序,它有效地執行以下操作:Python的類型錯誤:unhashable類型:「名單」

if [4, 5, False, False, False, False] in {}

而且,在這條線,我得到一個TypeError: unhashable type 'list'

我做錯了什麼?

+0

究竟是什麼你想實現什麼? – gerrit

+0

我的數據結構看起來像[4,5,False,False,False,False],我想在無序列表中找到它們。 {}是這樣一個例子(我的代碼碰巧在當時是失敗的)。我現在使用的是一個列表,而不是一本字典,而且效果更好。 –

回答

5

代碼if foo in {}檢查是否有任何字典的鍵是等於foo

在你的榜樣,foo是一個列表。一個列表是一個不可乾的類型,不能是字典的關鍵字。

如果你想檢查是否列表中的任何項包含在一個字典鍵或在一組,你可以嘗試:

if any([x in {} for x in (4, 5, False)])

如果你想檢查是否有你的價值觀是等於你的列表,你可以嘗試:

if any([v == [4, 5, False, False, False, False] for v in your_dict.values()])

0

你可以做這樣的事情

if all(x in {} for x in [4, 5, False, False, False, False]): 
    .... 

if any(x in {} for x in [4, 5, False, False, False, False]): 
    .... 

取決於你想要

什麼
+0

'any(x in {} for [4,5,False])''返回'True'。我對此感到驚訝,我猜「任何」都認爲可迭代是整體,迭代器是真的。所以它應該是'any([x in {} for x in [4,5,False]])''。 – gerrit

+0

@gerrit'任何(在X {}在[4,5,假]×)''返回爲FALSE'我,無論在Python 2.7和3.3 –

+0

@JanneKarila啊哈!我正在使用''pylab',它'從numpy導入*'。 'numpy'''任何'都隱藏了內置的任何'。 – gerrit

1

set持有可哈希對象,這意味着它們是可排序它使有效的搜索/插入方法。 另一方面,list是不可散列的。這就是你的代碼出錯的原因。 我建議使用tuple而不是list

if (4, 5, False, False, False, False) in {}: 
    ... 
+0

這仍然更有效地寫成「if False:」。如果OP告訴我們他/她真正想實現什麼,那將會更有用。 – gerrit

+0

感謝您注意到元組可以用作字典鍵而不是列表。 –

相關問題