第零章 学前准备
第一章 数据结构 – 基本数据类型
第一章 数据结构 – 字符串
第一章 数据结构 – 列表、元组和切片
第一章 数据结构 – 字典
第一章 数据结构 – 集合
文章目录
第一章 数据结构 – 集合
1.2 组合数据类型
1.2.6 集合
集合有两个实现类:可变 set
和不可变 frozenset
。
集合的本质是许多唯一对象的聚集。因此,集合拥有去重的功能。集合中的元素必须是可散列的, set
类型本身是不可散列的,但是 frozenset
可以。
1.2.6.1 定义和初始化
# 1", "空集
from unicodedata import name
test_set = set()
print(test_set)
# 2", "集合的字面量
test_set = {
1, 2, 3}
print(test_set)
# 3", "通过可迭代对象
test_set = set([1, 2, 3, 4])
print(test_set)
# 4", "集合推导setcomps
{
chr(i) for i in range(32, 256) if 'SIGN' in name(chr(i), '')}
1.2.6.2 集合的操作
1.2.6.2.1 集合的数学运算
数学符号 | Python运算符 | 方法 | 描述 |
---|---|---|---|
S ∩ Z | s & z | s.and(z) | s 和 z的交集 |
z & s | s.rand(z) | 反向 & 操作 | |
s.intersection(it , ...) | 把可迭代的 it 和其他所有参数转化为集合,然后求它们与 s 的交集 | ||
s &= z | s.iand_(z) | 把s更新为 s 和 z 的交集 | |
s.intersection_update(it , ...) | 把可迭代的 it 和其他所有参数转化为集合,然后求得它们与 s 的交集,然后把 s 更新成这个交集 | ||
S ∪ Z | s | z | s.or(z) | s 和 z的并集 |
z | s | s.ror(z) | | 的反向操作 | |
s.union(it , ...) | 把可迭代的 it 和其他所有参数转化为集合,然后求它们与 s 的并集 | ||
s |= z | s.ior_(z) | 把s更新为 s 和 z 的并集 | |
s.update(it , ...) | 把可迭代的 it 和其他所有参数转化为集合,然后求得它们与 s 的并集,然后把 s 更新成这个并集 | ||
S \ Z | s - z | s.sub(z) | s 和 z的差集,或者叫作相对补集 |
z - s | s.rsub(z) | - 的反向操作 | |
s.difference(it , ...) | 把可迭代的 it 和其他所有参数转化为集合,然后求它们与 s 的差集 | ||
s -= z | s.isub_(z) | 把s更新为 s 和 z 的差集 | |
s.difference_update(it , ...) | 把可迭代的 it 和其他所有参数转化为集合,然后求得它们与 s 的差集,然后把 s 更新成这个差集 | ||
s.symmetric_difference(it) | 求 s 和 set(it) 的对称差集 | ||
S △ Z | s ^ z | s.xor(z) | s 和 z的对称差集 |
z ^ s | s.rxor(z) | ^ 的反向操作 | |
s.symmetric_difference_update(it , ...) | 把可迭代的 it 和其他所有参数转化为集合,然后求它们与 s 的对称差集,最后把 s 更新成该结果 | ||
s ^= z | s.ixor_(z) | 把s更新为 s 和 z 的对称差集 |
1.2.6.2.2 集合的比较运算符
数学符号 | Python运算符 | 方法 | 描述 |
---|---|---|---|
s.isdisjoint(z) | 查看 s 和 z是否不相交(没有共同元素) | ||
e ∈ s | e in s | s.contains(e) | 元素 e 是否属于 s |
e ∈ s | e in s | s.contains(e) | 元素 e 是否属于 s |
s ⊆ z | s <= z | s.le(z) | s 是否为 z的子集 |
s.issubset(it) | 把可迭代的 it 转化为集合,然后查看 s 是否为它的子集 | ||
s ⊂ z | s < z | s.lt(z) | s 是否为 z 的真子集 |
s ⊇ z | s >= z | s.ge(z) | s 是否为 z 的父集 |
s.issuperset(it) | 把可迭代的it转化为集合,然后查看s是否为它的父集 | ||
s ⊃ z | s > z | s.gt(z) | s 是否为 z 的真父集 |
1.2.6.2.3 集合类型的其它方法。
set
无序排序且不重复,是可变的,有add()
,remove()
等方法。既然是可变的,所以它不存在哈希值。基本功能包括关系测试和消除重复元素. 集合对象还支持union
(联合), intersection
(交集), difference
(差集)和sysmmetric difference
(对称差集)等数学运算。set
支持 x in set
, len(set)
, 和 for x in set
。
作为一个无序的集合,set
不记录元素位置或者插入点。因此,set
不支持 indexing
, 或其它类序列的操作。frozenset
是冻结的集合,它是不可变的,存在哈希值,好处是它可以作为字典的key
,也可以作为其它集合的元素。缺点是一旦创建便不能更改,没有add
,remove
方法。
Python方法 | set | froznset | 描述 |
---|---|---|---|
s.add(e) | * | 把元素 e 添加到 s 中 | |
s.clear() | * | 移除 s 中所有元素 | |
s.copy() | * | * | 对 s 浅复制 |
s.discard(e) | * | 如果 s 中有 e 这个元素的话,将其移除 | |
s.__iter__() | * | * | 返回 s 的迭代器 |
s.__len__() | * | * | len(s) |
s.pop() | * | * | 从s中移除一个元素并返回它的值,若s为空,则抛出KeyError异常 |
s.remove(e) | * | 从s中移除e元素,若e元素不存在,则抛出KeyError异常 |