我知道这是一个常见问题,并且有很多帖子讨论围绕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)
答案 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")])