目录
- 一、集合的介绍与创建
- 二、集合的存储原理
- 三、元素的修改
-
- [1. 添加元素](#1. 添加元素)
- [2. 删除元素](#2. 删除元素)
- 四、集合的运算
- 五、集合的判定
一、集合的介绍与创建
集合 (set
),一种可变、无序、不重复 的数据结构,由大括号{}
内、用逗号分隔的一组元素组成。
集合的元素是可变 的,即,它支持元素的引用的直接修改,并有相应的操作函数。
与同为组合的序列不同,集合的元素是无序 的。这意味着元素的顺序与其添加的顺序无关,并且元素也不再支持索引访问 。
集合的访问 仅可通过组合的通用操作 进行,如:for
循环遍历、成员运算 。(见第三篇和第七篇)
集合的元素是不重复 的,也就是说,集合可自动对内部的元素进行去重处理。
与序列同理,集合同样有赋值创建 和引用创建 ,对应类似的函数set()
。此外,类似于列表生成式(见第六篇),还支持集合生成(推导)式。
python
# 直接创建
set_ = {1, 2, 3}
print(set_) # {1, 2, 3}
# 引用创建
set_ = set([1, 2, 3])
print(set_) # {1, 2, 3}
# 空集
set_ = set()
print(set_) # set()
# 集合生成式
set_ = {i**2 for i in range(10) if i%2 == 0}
print(set_) # {0, 64, 4, 36, 16}
二、集合的存储原理
集合通过哈希表 来实现存储,即使用散列函数 将元素映射到表中的位置。
元素的地址 会通过哈希函数 计算得到一个定长数字,该数字称为哈希值 或散列值 。而哈希表 是一种根据键的哈希值直接访问存储位置的数据结构,也称为散列表。
不同元素的哈希值可能相同,这就是哈希冲突。当发生冲突时,系统将元素添加到哈希桶的尾部,使其成为链表的节点。
集合的元素不会重复,是因为哈希表的结构会使得相同元素的会映射到同一地址。
三、元素的修改
1. 添加元素
add(element)
:添加一个元素。update(iterable)
:添加一个组合内的元素。
python
set_ = set()
# 单个添加
set_.add('num')
print(set_) # {'num'}
# 多个添加
set_.update(range(5))
print(set_) # {0, 1, 2, 3, 4, 'num'}
2. 删除元素
后三个函数同样适用于列表的元素删除,语法格式与集合相似,但缺失索引后,其功能范围有所变化。
其中,pop()
的 "任意" 是与哈希值有关的伪随机机制。
python
set_ = set(range(5)) # {0, 1, 2, 3, 4}
# 定向删除
set_.discard(0)
print(set_) # {1, 2, 3, 4}
set_.remove(1)
print(set_) # {2, 3, 4}
# 不定向删除
set_.pop()
print(set_) # {3, 4}
# 清空
set_.clear()
print(set_) # set()
四、集合的运算
set1.intersection(set2)
:交 运算,对应运算符&
,即set1 & set2
set1.union(set2)
:并 运算,对应运算符|
,即set1 | set2
set1.difference(set2)
:差 运算,对应运算符-
,即set1 - set2
set1.symmetric_difference(set2)
:对称差运算
其中,并运算可用于元素的添加,区别在于:集合的运算返回的是一个新的集合。
python
set1 = {'c', 'a', 't'}
set2 = {'h', 'a', 't'}
# 取交
print(set1.intersection(set2)) # {'t', 'a'}
print(set1 & set2)
# 取并
print(set1.union(set2)) # {'t', 'c', 'h', 'a'}
print(set1 | set2)
# 取差:从 set1 中去掉 set1&set2 的元素
print(set1.difference(set2)) # {'c'}
print(set1 - set2)
# 对称取差:从 set1|set2 中去掉 set1&set2 的元素
print(set1.symmetric_difference(set2)) # {'c', 'h'}
print((set1 | set2) - (set1 & set2))
# 地址更改
print(id(set1)) # 2357217208448
print(id(set2)) # 2357217209344
print(id(set1.union(set2))) # 2357217208672
五、集合的判定
set1.isdisjoint(set2)
:判断两集是否存在相同元素set1.issubset(set2)
:判断set1
是否为set2
的子集set1.issuperset(set2)
:判断set1
是否为set2
的超集
以上函数的返回值类型为布尔。
python
set1 = set('apple')
set2 = set('app')
# 无共同元素为真
print(set1.isdisjoint(set2)) # False
# set2 Ↄ set1 为真
print(set1.issubset(set2)) # False
# set1 Ↄ set2 为真
print(set1.issuperset(set2)) # True