2013-02-07 48 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

感谢您注意到元组可以用作字典键而不是列表。 –

相关问题