home1.gif

set:集合
collection:集合类型

一. set 的基本特性


  • set 是可变的、无序的、不重复的元素的集合;
  • set 的元素必须是可以hash哈希的 (目前不可哈希的有list)
  • set 元素不可以索引访问
  • set 元素可以迭代


可 hash:

  1. 数值型,int/float/complex
  2. 布尔型,True/False
  3. 字符串,string/bytes
  4. 元组,tuple
  5. None

以上都是不可变类型,是可哈希类型hashable

1. set 初始化 (定义)


定义 set 的几个方法:

  1. s1 = set()
  2. s2 = set(iterable) # s2 = set(list(range(5)))
  3. s3 = {1, } # {} 表示字典

2. 查询 set 元素


因集合 set 是非线性结构,它是不能索引的,虽不能一一索引,

但是,

集合 set 的元素是可以迭代的。

在 set 中学会使用成员运算符:in、not in,比如:

  1. 'a' in {'a', 'b', 'c'} # -> True
  2. 'a' not in {'a', 'b', 'c'} # -> False

list、dict、set 的查找效率: 线性结构(如list)的查询时间复杂度是O(n),这种结构随着数据规模的增大而加大耗时; 而set、dict等结构,内部使用hash值作为key,时间复杂度可以做到O(1),查询时间和数据规模无关。所以,类似成员运算符 in 分别应用到 list、dict、set 中搜索元素时,查找的效率是:set > dict > list。so, 如果需要频繁的查找,就尽量使用 set 吧。

3. 修改 set 元素


hi,小子,集合 set 的元素是不能修改的。为啥?没有为啥,先记住吧。。。

4. 增加 set 元素


  • add()

    1. set_obj.add(element) -> None

    增加一个元素到 set 中,如果元素存在,就什么都不做。

  • update()

    1. set_obj.update(*other) -> None

    说明:

  1. 合并其他元素到 set 集合中来;
  2. 参数 *ther 是一个对象,一个可迭代对象;
  3. 就地修改,返回 None

5. 删除 set 元素


  • remove()

    1. set_obj.remove(elem) -> None

    从集合 set_obj 中移除一个元素elem,如元素不存在,就抛出异常。返回None。
    **

  • discard()

    1. set_obj.discard(elem) -> None

    从集合 set_obj 中移除一个元素elem,如不存在,就什么都不做。返回None。
    **

  • pop()

    1. set_obj.pop() -> item

    移除并返回任意的元素,若 set_obj 是空集则返回异常。
    **

  • clear()

    1. set_obj.clear() -> None

    移除所有元素。

goon.gif

一. 集合类型 collection 及运算


集合类型的基本包括:

  • 全集U (A/B为其子集)
  • 子集/真子集、超集/真超集
  • 并集,合并在一起
  • 交集,公共部分
  • 差集,除去公共部分
  1. set_a = set('abracadabra')
  2. set_b = set('alacazam')
  3. set_c = set('cbd')

1. 并集


并集,将多个集合的所有元素合并到一起。

  • union() 或 |

    1. set_obj.union(*other) -> set

    返回新集合,union() 等同运算符 |

    1. set_a.union(set_b)
    2. set_a | set_b
  • update() 或 |=

    1. set_obj.update(*other) -> None

    返回None,但它属于就地修改。

2. 交集


交集,所有属于集合A和集合B的元素集合,即A和B的公共元素

  • intersection() 或 &

    1. set_obj.intersection(*other) -> set
  • intersection_update() 或 &=

    1. set_obj.intersection_update(*other) -> None

3. 差集


差集,由属于集合A但不属于B的元素的集合。

  • difference() 或 -

    1. set_obj.difference(*other) -> set
  • difference_update() 或 -=

    1. set_obj.difference_update(*other) -> None

4. 对称差集


对称差集,符号等式为 (A - B) U (B - A)

  • symmetric_difference() 或 ^
  • symmetric_difference_update() 或 ^=

5. 集合运算


  • issubset() 或 <=

    1. set_obj.issubset(other_set) -> bool

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

  • 或 <

    1. set_obj_1 > set_obj_2 # 是否是真子集
    2. set_obj_1 < set_obj_2 # 是否是真超集

    判断 set_obj_1 是否是 set_obj_2 的真子集、真超集

  • issuperset() 或 >=

    1. set_obj.issuperset(other_set) -> bool

    判断当前集合是否是 other_set 的超集。

  • isdisjoint()

    1. set_obj.isdisjoint(other_set) -> bool

    判断当前集合和另一个集合是没有交集的,确实没有交集就返回 True,有交集返回 False。

end1.gif