Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 类型错误:不可损坏的类型:';列表';仅当使用多维列表初始化集合时_Python_Python 3.x_List_Set - Fatal编程技术网

Python 类型错误:不可损坏的类型:';列表';仅当使用多维列表初始化集合时

Python 类型错误:不可损坏的类型:';列表';仅当使用多维列表初始化集合时,python,python-3.x,list,set,Python,Python 3.x,List,Set,我知道这是一个经常被问到的问题,有很多帖子都在讨论集合元素的hash-able属性,但我试图理解为什么集合可以接受1D列表而不是多维列表来初始化它 看看下面的代码:Case1,Case2起作用(它们接受1D列表),而Case3不起作用(它接受2D列表)维度在集合初始化中的作用和方式。 #Case1: cities = set(["Frankfurt", "Basel","Freiburg"]) print(cities) #Case2: citylist = list(["Frankfurt"

我知道这是一个经常被问到的问题,有很多帖子都在讨论集合元素的hash-able属性,但我试图理解为什么集合可以接受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)

在案例1和2中,没有列表被散列。列表被迭代,它的元素被散列。散列元素不是列表,并且在其他方面是可散列的,所以这很好


但是在案例3中,外部列表像前面一样进行迭代,但是列表的每个元素都是另一个列表,尝试对其进行散列。正如你所知,这不会有好的结局

在案例1和案例2中,没有对列表进行哈希运算。列表被迭代,它的元素被散列。散列元素不是列表,并且在其他方面是可散列的,所以这很好


但是在案例3中,外部列表像前面一样进行迭代,但是列表的每个元素都是另一个列表,尝试对其进行散列。正如你所知,这不会有好的结局

简短回答

字符串是可散列的,但列表不是

更长的答案

使用
set
函数时,请准确了解散列的内容

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

在案例3中,您正在对列表的元素进行散列,这些元素本身就是列表


因为列表是可变对象,所以它们不是

简短回答

字符串是可散列的,但列表不是

更长的答案

使用
set
函数时,请准确了解散列的内容

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

在案例3中,您正在对列表的元素进行散列,这些元素本身就是列表


因为列表是可变对象,所以它们不是

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

这会奏效的

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

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

这会奏效的

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

这是因为在前两种情况下,实际上是将列表转换为一个集合,即列表中的各个元素成为集合的元素。因为这些是字符串,并且字符串是可散列的,所以它们在集合中是允许的

在第三种情况下,您试图转换为集合的列表元素是列表本身,而列表是不可散列的,因此会出现错误。这相当于你曾经尝试过:

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

这是因为在前两种情况下,实际上是将列表转换为一个集合,即列表中的各个元素成为集合的元素。因为这些是字符串,并且字符串是可散列的,所以它们在集合中是允许的

在第三种情况下,您试图转换为集合的列表元素是列表本身,而列表是不可散列的,因此会出现错误。这相当于你曾经尝试过:

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