集合Set
Python中,它是可变的、无序的、不重复的元素的集合
初始化
set( ) set(iterable)
s1=set( )
s2=set(range(5))
s3=set([1,2,3])
s4=set('abcd')
注意:
s5={ } #是字典不是集合
s6={1,2,3}
s7={1,(1,)}
s8=(1,(1,),[1]} #报错
元素性质
- 去重:在集合中,所有元素必须是唯一的
- 无序: 因为无序,所以不可索引
- 可哈希:Python集合中的元素必须是可hash,即元素都可以使用内置hash函数
- 可hash类型:
- 数值型int、float、complex
- 布尔型True、False
- 字符串String、bytes
- tuple
- None
- 不可hash的类型:
- list
- set
- bytearry
- 可hash类型:
- 可迭代: set中元素虽然不一样,但元素可以迭代出来
增加
- add( )
- 如果元素存在则不操作
- update(*others)
- 合并其他元素到set集合中
- 参数other必须是迭代对你
- 就地修改
移除
-
remove( ) 移除元素,不存在会报错 KeyError
-
discard( ) 移除元素,不存在不操作
-
pop( ) 移除并返回任意的元素,空集返回KeyError异常
-
clear( ) 移除所有元素
不可修改
集合类型没有修改。因为元素唯一。
不可索引
非线性结构,不可索引
遍历
可遍历,效率O(n)
列表和集合搜索效率
- 列表为线性数据结构,搜索元素的时间复杂度是O(n),即随数据规模增加耗时增大
- set、dict使用hash表实现,内部使用hash值作为key,时间复杂度是O(1),查询时间和数据规模无关,不会数据规模增大而搜索性能下降
集合概念
- 全集
- 所有元素的集合。
- 子集subset和超集superset
- 一个集合A所有元素都在另一个集合B中,A是B的子集,B是A是超集
- 真子集和真超集
- A是B的子集,且A不等于B, A就是B的真子集,B是A的真超集
- 并集:多个集合合并的结果
- 交集:多个集合的公共部分
- 差集:集合中除去和其他集合公共部分
并集
将两个集合A和B的所有元素合并在一起,组成的集合称为集合A和集合B的并集
- union(*others) 返回和多个集合合并后的新集合
- | 运算符重载,等同union
- update(*others)和多个集合合并,就地修改
- |= 等同update
>>> a={1,2,3}
>>> b={2,3,4,5}
>>> print(a.union(b))
{1, 2, 3, 4, 5}
>>> print(a|b)
{1, 2, 3, 4, 5}
交集
集合A和B公共部分
- intersection(*others) 返回和多个集合的交集
- & 等同intersection
- intersection_update(others) 获取和多个集合的交集,并就地修改
- &= 等同intersection_update
>>> a={1,2,3}
>>> b={2,3,4,5}
>>> print(a&b)
{2, 3}
差集
集合A和B, A-B 属于A且不属于B的元素组成的集合,即A中去掉与B相同元素。
- difference(*others) 返回和多个集合的差集
- & 等同difference
- difference_update(others) 获取和多个集合的差集,并就地修改
- -= 等同difference_update
>>> a={1,2,3}
>>> b={2,3,4,5}
>>> print(a-b)
{1}
对称差集
集合A和B, 由所有不属于A和B的交集元素组成的集合,记作(A-B) U (B-A) 即去掉交集
- symmetric_differece(*others) 返回和多个集合的差集
- ^ 等同symmetric_differece
- symmetric_differece_update(others) 获取和另一个集合的对称差集,并就地修改
- ^= 等同symmetric_differece_update
>>> print(a^b)
>>> a={1,2,3}
>>> b={2,3,4,5}
{1, 4, 5}
其他集合运算
- issubset(other)、<=判断当前集合是否是另一个集合的子集
- set1 < set2 判断set1是否是set2的真子集
- issuperset(other)、>=判断当前集合是否是other的超集
- set1 > set2 判断set1是否是set2的真超集
- isdisjoint(other)当前集合和另一个集合没有交集,没有交集,返回True