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 集合的使用场景

  • 集合可以用于过滤其他集合体中的重复项(尽管元素在该过程可能重新排序)
  • 集合可以提取列表、字符串以及其他可迭代对象中的差异(转换成集合从而获得差异)
  • 可以通过转换成集合,借助集合进行顺序无关的等价性测试