TypeError:unhashable type:'list'仅在使用多维列表初始化set时

时间:2018-04-09 12:14:32

标签: python python-3.x list set

我知道这是一个常见问题,并且有很多帖子讨论围绕set元素的hash-able属性的主题,但我试图理解为什么set可以接受1D列表而不是多维列表来初始化它

看下面的代码:Case1,Case2工作(他们接受1D列表)而Case3不工作(它接受2D列表)。 维度初始化中维度的作用和方式。

#Case1:
cities = set(["Frankfurt", "Basel","Freiburg"])
print(cities)

#Case2:
citylist = list(["Frankfurt", "Basel","Freiburg"])
setofcitites = set(citylist)
print(setofcitites)

#Case3:
more_cities = set([["Frankfurt", "Basel","Freiburg"], ["Dubai", "Toronto","Sydney"]])
print(more_cities)

4 个答案:

答案 0 :(得分:2)

简短回答

字符串是可清除的,但列表不是。

更长的答案

使用set函数时,精确理解正在散列的内容

在案例1和案例2中,您正在对列表中的元素进行哈希处理,这些元素实际上是字符串。

在案例3中,您正在散列列表的元素,列表本身

由于列表是可变对象,因此它们不是hashable

答案 1 :(得分:1)

在案例1和案例2中,没有列表被散列。迭代列表,并对其元素进行哈希处理。散列元素不是列表,否则可以散列,所以它很好。

在情况3中,外部列表像以前一样迭代,但列表的每个元素都是另一个列表,尝试进行哈希处理。如你所知,那不会很好。

答案 2 :(得分:1)

这是因为在前两种情况下,您基本上将列表转换为集合,即列表的各个元素成为集合的元素。由于这些是字符串,并且字符串是可清除的,因此它们可以在集合中使用。

在第三种情况下,您尝试转换到列表中的列表元素是列表本身,列表不可清除,因此错误。它等同于你曾试图做的事情:

your_set = set()
your_set.add("Frankfurt")  # OK
your_set.add(["Frankfurt", "Basel"])  # Err

答案 3 :(得分:0)

list是可变对象,因此不能被散列

这将起作用

more_cities = set([("Frankfurt", "Basel","Freiburg"), ("Dubai", "Toronto","Sydney")])