Set comprehension在Python中给出了“unhashable type”(列表集)

时间:2017-02-21 09:46:40

标签: python set set-comprehension

我有以下元组列表:

list_of_tuples = [('True', 100, 'Text1'),
                  ('False', 101, 'Text2'),
                  ('True', 102, 'Text3')]

我想将每个元组的所有第二个元素收集到一个集合中:

my_set = set()
my_set.add({tup[1] for tup in list_of_tuples})

但它会引发以下错误:

TypeError: unhashable type: 'set'

当我在迭代中打印出相应的元素时,它表明集合理解的结果不包含预期的标量而是列表:

print {tup[1] for tup in list_of_tuples}

set([100, 101, 102])

为什么会这样?为什么这会先将元素放入列表中,然后将列表放入一个没有任何提示列表的集合中?我怎么能纠正我的解决方案?

2 个答案:

答案 0 :(得分:3)

您放入集合中的各个项目不可变,因为如果它们发生更改,则有效散列会发生变化,并且检查包含的能力会中断。

set的内容可以在其生命周期内更改。所以这是非法的。

所以试着用这个:

list_of_tuples = [('True', 100, 'Text1'),
                  ('False', 101, 'Text2'),
                  ('True', 102, 'Text3')]


my_set= { tup[1] for tup in list_of_tuples }
# set comprehensions with braces
print my_set

希望这有帮助。

答案 1 :(得分:1)

您正在定义一个空集,然后尝试在其中添加另一个集。相反,只需直接创建集合:

my_set = {tup[1] for tup in list_of_tuples}

你的打印结果就是Python代表集合的方式;它没有向您显示有一个列表,它显示了一个由100,101和102组成的集合。