集set

  • set是可变的、无须的、不会重复的元素集合

set的元素特点

  • set的元素必须可以hash
  • set的元素不可索引
  • set的元素可以迭代

set集的创建

  1. set(range(9))
  2. s1 = {1,2,'a'}
  • 不可使用s1 = {}来创建,因为{}为字典的创建方式
  • 使用{}方式创建参数必须为可hash对象
  • 使用set()方式创建参数必须为可迭代对象,此方式会将迭代对象解析为可hash元素
  1. In [9]: set(1,2)
  2. TypeError: set expected at most 1 arguments, got 2
  3. In [11]: s1 = {1,2,[2,3]}
  4. TypeError: unhashable type: 'list'

set增加元素

  • add(elem)

    • 增加一个元素到set中
    • 如果元素存在,什么都不做
  • update(*others)

    • 合并其他元素到set集中
    • 参数others必须为可迭代对象,可为多个可迭代对象
    • 原处修改
  1. # add
  2. In [16]: s1
  3. Out[16]: {1, 2, 4}
  4. In [17]: s1.add(5)
  5. In [18]: s1.add(1)
  6. In [19]: s1
  7. Out[19]: {1, 2, 4, 5}
  8. # update
  9. In [20]: s2 = {'a', 2, '2', 'c'}
  10. In [21]: s1.update(s2)
  11. In [22]: s1
  12. Out[22]: {1, 2, '2', 4, 5, 'a', 'c'}

set移除元素

  • remove(elem)

    • 从set中移除指定的元素
    • 元素不存在,抛出keyError异常

      • remove时会根据给定的值的hash来做移除操作,故如不存在会抛出keyError异常
  • discard(elem)

    • 从set中移除指定的元素
    • 元素不存在,什么都不做
  • pop()—>item

    • 移除并返回任意的元素。

      • 因set中元素为无序的,故为随机元素
    • 空集使用pop返回keyError异常
  • clear()

    • 移除所有元素
  1. In [23]: s1.remove(2)
  2. In [24]: s1
  3. Out[24]: {1, '2', 4, 5, 'a', 'c'}
  4. In [25]: s1.remove(2)
  5. KeyError: 2
  6. In [26]: s1.discard(2)

set修改元素

  • 修改

    • set没有修改元素的操作
    • 要么删除,要么添加
  • 查询

    • set为非线性结构,无法索引
  • 遍历

    • 可迭代所有元素
  • 成员运算符

    • in和not in可判断元素是否在set中
    • 判断依据为hash判断,效率很高,时间复杂度为O(1)

set效率

  • 线性结构查询时间复杂度时O(n),即随着数据规模增大而耗时增加
  • set、dict等结构,内部使用hash值作为key,不会因数据规模增大而增加耗时
  • 可hash

    • 数值型int、float
    • 布尔型
    • 字符串string、bytes
    • tuple
    • None
  • set的元素必须是可hash的

注:线性结构查询推荐使用索引(index)查询

set运算

  • 并集

    • 将两个集合中所有的元素合并在一起
    • union(*others)

      • 返回多个集合合并后的结果,返回一个新的对象
    • |运算符重载,等同于union
    • update(*others)

      • 多个集合合并,原地修改
    • |=,等同于update
  • 交集

    • 集合A和B,由所有属于A即属于B的元素组成
    • intersection(*others)

      • 返回多个集合的交集。返回一个新的对象
    • & 等同intersection
    • intersection_update(*other)

      • 获取和多个集合的交集,原处修改
    • &=,等同于intersection_update
  • 差集

    • 集合A和B,由所有属于A且不属于B的元素组成
    • Difference(*others)

      • 返回多个集合的差集,返回一个新的对象
    • -等同于difference
    • difference_update(*other)

      • 获取多个集合 的差集并在原处修改
    • -= 等同于difference_update
  • 对称差集

    • 集合A和B,由所有不属于A且不属于B的交集元素组成的集合,记作(A-B) u (B-A)
    • symmetric_differece(other)

      • 返回和另一个集合的差集
    • ^

      • 等同于symmetric_differece
    • symmetric_differece_update(other)

      • 获取和另一个集合的差集并就地修改
    • ^=

      • 等同symmetric_differece_update

集合运算

  • issubset(other)

    • 判断当前集合是否是另一个集合的子集