type
status
date
slug
summary
tags
category
icon
password
集合,简称集,是用{}括起来的单元素数据集。高级语言都实现了这个非常重要的数据结构类型。
Python中,它是可变的、无序的、不重复的元素的集合.
- 内部元素是可哈希的
- 集合本身是不可哈希的
可哈希数据类型:
- 数值型int、float、complex
- 布尔型True、False
- 字符串string、bytes
- None
- 以上都是不可变类型,都是可哈希类型(hashable)
6.1 初始化
- set() → new empty set object
- set(iterable) → new set object
注意,在Python中,
{}
表示的是空字典,因此空集合必须通过内置函数set来创建。元素性质
- 去重:在集合中,所有元素必须相异
- 无序:因为无序,所以不可索引
- 可哈希:Python集合中的元素必须可以hash,即元素都可以使用内建函数hash
- 目前学过的不可hash的类型有:list、set、bytearray,
- 可迭代:set中虽然元素不一样,但元素都可以迭代出来(即可遍历)
6.2 增.删.遍历.查询.去重
集合中元素是不可修改的,这是因为集合是一种无序的、不重复的数据结构,它的实现方式是使用哈希表,而哈希表的实现需要保证元素的不可变性,才能保证哈希值的稳定性和正确性。如果非要修改集合中的元素,可以先将其删除,然后添加新元素来实现。
因为这一特性, 对集合是否为可变对象存在争议, 如果将字典中键定义为集合, 会报错,提示集合为不可哈希,但是从不可变类型定义来说(在不改变地址值的情况下,对元素内容进行改变, 就是可变类型), 集合严格意义上来说是可变类型.
- add(elem) 添加单个元素
- update(*others) 合并其他元素到set集合中,参数可为一个或多个可迭代对象,就地修改
- remove(elem) 删除元素,就地修改无返回值,没有会报错。效率为O(1)
- discard(elem) 删除元素,就地修改无返回值,没有不会报错。效率为O(1)
- pop() → item 移除并返回随机元素。空集报KeyError异常
- clear() 移除所有元素
- 遍历:只要是容器都可以遍历元素。但是效率都是O(n)
- in 成员运算符:效率高,不会随着数据规模增加降低效率,为O(1) 10 in {10,11,12,13,14}
对于线性数据结构,in等搜索操作时间复杂度为O(n)
- 集合元素的不可重复性可用来进行去重
- list(set([1, 2, 1, 3, 1]))
6.3 集合运算
其他运算 | 含义 |
<= | 判断子集 |
< | 判断真子集 |
>= | 判断超集 |
> | 判断真超集 |
isdisjoint(other) | 判断是否有交集,没返回True |
6.4 冻结集合
- frozenset() -> empty frozenset object
- frozenset(iterable) -> frozenset object
frozenset() 返回一个冻结的集合,冻结后集合不能再添加或删除任何元素(即不可变)。如果不提供任何参数,默认会生成空集合。
上面的内容提到过,集合本身是可变的,所以集合不能直接嵌入到其他集合当中,但是可以通过frozenset函数创建一个不可变的集合,这样既可以嵌套到其他集合中。
6.5 集合的使用场景
- 集合可以用于过滤其他集合体中的重复项(尽管元素在该过程可能重新排序)
- 集合可以提取列表、字符串以及其他可迭代对象中的差异(转换成集合从而获得差异)
- 可以通过转换成集合,借助集合进行顺序无关的等价性测试