Python 类型错误:不可损坏的类型:';列表';仅当使用多维列表初始化集合时
我知道这是一个经常被问到的问题,有很多帖子都在讨论集合元素的hash-able属性,但我试图理解为什么集合可以接受1D列表而不是多维列表来初始化它 看看下面的代码:Case1,Case2起作用(它们接受1D列表),而Case3不起作用(它接受2D列表)维度在集合初始化中的作用和方式。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"
#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