set:集合
collection:集合类型
一. set 的基本特性
- set 是可变的、无序的、不重复的元素的集合;
- set 的元素必须是可以hash哈希的 (目前不可哈希的有list)
- set 元素不可以索引访问
- set 元素可以迭代
可 hash:
- 数值型,int/float/complex
- 布尔型,True/False
- 字符串,string/bytes
- 元组,tuple
- None
以上都是不可变类型,是可哈希类型hashable
1. set 初始化 (定义)
定义 set 的几个方法:
s1 = set()
s2 = set(iterable) # s2 = set(list(range(5)))
s3 = {1, } # {} 表示字典
2. 查询 set 元素
因集合 set 是非线性结构,它是不能索引的,虽不能一一索引,
但是,
集合 set 的元素是可以迭代的。
在 set 中学会使用成员运算符:in、not in,比如:
'a' in {'a', 'b', 'c'} # -> True
'a' not in {'a', 'b', 'c'} # -> False
list、dict、set 的查找效率: 线性结构(如list)的查询时间复杂度是O(n),这种结构随着数据规模的增大而加大耗时; 而set、dict等结构,内部使用hash值作为key,时间复杂度可以做到O(1),查询时间和数据规模无关。所以,类似成员运算符 in 分别应用到 list、dict、set 中搜索元素时,查找的效率是:set > dict > list。so, 如果需要频繁的查找,就尽量使用 set 吧。
3. 修改 set 元素
hi,小子,集合 set 的元素是不能修改的。为啥?没有为啥,先记住吧。。。
4. 增加 set 元素
add()
set_obj.add(element) -> None
增加一个元素到 set 中,如果元素存在,就什么都不做。
update()
set_obj.update(*other) -> None
说明:
- 合并其他元素到 set 集合中来;
- 参数 *ther 是一个对象,一个可迭代对象;
- 就地修改,返回 None
5. 删除 set 元素
remove()
set_obj.remove(elem) -> None
从集合 set_obj 中移除一个元素elem,如元素不存在,就抛出异常。返回None。
**discard()
set_obj.discard(elem) -> None
从集合 set_obj 中移除一个元素elem,如不存在,就什么都不做。返回None。
**pop()
set_obj.pop() -> item
移除并返回任意的元素,若 set_obj 是空集则返回异常。
**clear()
set_obj.clear() -> None
移除所有元素。
一. 集合类型 collection 及运算
集合类型的基本包括:
- 全集U (A/B为其子集)
- 子集/真子集、超集/真超集
- 并集,合并在一起
- 交集,公共部分
- 差集,除去公共部分
set_a = set('abracadabra')
set_b = set('alacazam')
set_c = set('cbd')
1. 并集
并集,将多个集合的所有元素合并到一起。
union() 或 |
set_obj.union(*other) -> set
返回新集合,union() 等同运算符 |
set_a.union(set_b)
set_a | set_b
update() 或 |=
set_obj.update(*other) -> None
返回None,但它属于就地修改。
2. 交集
交集,所有属于集合A和集合B的元素集合,即A和B的公共元素
intersection() 或 &
set_obj.intersection(*other) -> set
intersection_update() 或 &=
set_obj.intersection_update(*other) -> None
3. 差集
差集,由属于集合A但不属于B的元素的集合。
difference() 或 -
set_obj.difference(*other) -> set
difference_update() 或 -=
set_obj.difference_update(*other) -> None
4. 对称差集
对称差集,符号等式为 (A - B) U (B - A)
- symmetric_difference() 或 ^
- symmetric_difference_update() 或 ^=
5. 集合运算
issubset() 或 <=
set_obj.issubset(other_set) -> bool
判断当前集合是否是另一个集合的子集。
或 <
set_obj_1 > set_obj_2 # 是否是真子集
set_obj_1 < set_obj_2 # 是否是真超集
判断 set_obj_1 是否是 set_obj_2 的真子集、真超集
issuperset() 或 >=
set_obj.issuperset(other_set) -> bool
判断当前集合是否是 other_set 的超集。
isdisjoint()
set_obj.isdisjoint(other_set) -> bool
判断当前集合和另一个集合是没有交集的,确实没有交集就返回 True,有交集返回 False。