1. set 集合
set 这种数据类型,和数学上的集合意义差不多。
主要属性有:可变性,无序性,不重复性,可迭代。
这三个属性分别说明:set 可修改,不可索引,内部元素没有重复的。
用大括号(也叫花括号,可是哪花了) { } ,来表示这种类型。
{'1', '2', 'fuck'}
1.1 set 的定义
1.1.1 set()
定义空的set ,注意不能直接使用{ } ,来定义空的set 。
a = set() # 这是定义一个空的set
b = {} # 这是定义一个空的字典(dictionary)
直接用元素来定义。
a = {'the', 'bigbang', 'theory'}
一定要注意,虽然我写是按这个顺序写的,但其实在这set里,就像是把这些元素都扔在一个箱子里,而不是放在柜子的一个个抽屉里。
1.1.2 setname = {elements}
可以直接在括号里面写一个或多个元素的值,
s = {'happy', 'happy', 'sorrow', 'sad', 'tears'}
s
{'happy', 'sorrow', 'sad', 'tears'}
在这样直接定义的时候,如果出现了相同的元素,违反了set 的不重复性,python会自动帮我们去重。
1.1.3 set(iterable)
可以在括号中放一个可迭代对象,set() 会把每个元素取出来,去重之后,放在set 里。
注意,iterable 里也不能有不可hash的值,不管多少层都不行。
但是这个iterable可以是列表
s = set(range())
s
{0, 1, 2, 3, 4}
s1 = set((1, (1,), 'sorrow'))
s1
{(1,), 1, 'sorrow'} # 注意,一个只有1的元组,和int型1,是不一样的,不去重
s2 = set(['tears', 'rain'])
s2
{'rain', 'tears'}
1.2 set 的元素
set 里的元素必须是可哈希的(hashable)。
hash 是一个挺模糊的概念,我的理解是:每个值或者数据结构在内存中都要占用一块地方,hash就是要刨根问底,无论hash的对象是一个值,还是一个数据结构,都要一层一层的找下去,确保这个hash对象或者说这个数据结构都占用内存中的这块地方,不增加,也不减少,就这一亩三分地,不能动。
然后计算一个hash值,每个环境下的hash值都不一样。
a = ('sad')
hash(a)
-3743278410351786430
# 这里一定要注意,这只是我自己在我此时此刻的环境中的hash值,换一个环境就不是这个了。
所以说,不可变的值或数据结构都可以hash,例如:str int bool None bytes tuple等。可变的数据结构都不可hash,例如:list bytearray set。
1.3 set 的增加
1.3.1 s.add(element)
往s集合里添加一个元素,括号里只能写一个元素,但是不管这个元素是一个值,还是一个数据结构,只有一个就行。
如果是s集合里已有的元素,就不填加了,或者可以理解为,添加了,但是被去重了。
s = set()
s.add((1,))
s
{(1,)}
1.3.2 s.update(*other )
把其他的可迭代对象中的元素合并到s集合中,会把重复的元素去掉。
括号里可以写很多的可迭代对象,但是必须得是可迭代对象,单个元素不行,而且得可hash。
这种方法和上面的.add() 一样,都是对s集合就地修改。
s = set()
s.update(range(5), ['where', 'should', 5], ('I', 'go', 4))
s
{0, 1, 2, 3, 4, 'I', 'go', 'should', 'where'}
1.4 set的删除
1.4.1 s.remove(element)
从s集合中,移除一个element,因为set里面的元素是去重的,所以不存在什么像list一样从左往右找到第一个删除。
如果这个元素不存在于s集合里,就会报错。
s = {1,2,3}
s.remove(3)
s
{1,2}