集合的定义

  1. 集合只能用set函数来定义一个空集合
  2. 如 :set_ = set()

set元素

  1. set的元素要求必须可以hash
  2. 元素不可以使用索引
  3. set可以迭代
  4. 切片只能在线性结构中使用、set函数可以遍历可迭代对象
  5. set自动去重
  6. 注意列表,bytearray,set,字典(可变类型都不可)等是不可哈希类型—不能存放在set中
    注意它在确定是否是哈希类型时它将set中的所有元素都先查一遍包括set中容器中的元素
  7. 哈希函数—hash()用来确定是否可以哈希(哈希值一旦确定下来不能在改变)

set增加

  1. add(elem)–增加一个元素到set中 如果元素存在则什么都不做 注意:一次只能追加一个
  2. update(*others)
    1.合并其他元素到set集合中来
    2.参数必须是可迭代对象
    3.就地修改

set删除

  1. remove()移除一个元素,没有则抛异常
  2. discare()移除一个元素,如果不存在则什么也不做
  3. pop()因为集合无序所以随机删除一个,空集合则报错
  4. clear()清空所有元素
  5. Set—集合中使用in效率非常快—是因为它是可hash的—它的时间复杂度为O(1)
    列表等是不可hash的所以它的时间复杂度为O(n)

set修改,查询

  1. 修改
    1.要么删除,要么加如新的元素
  2. 查询:非线性结构,无法索引
  3. 遍历:可迭代所有元素
  4. 成员运算符:in 和 not in 判断元素是否在set中,效率高

hash原理

hash—原理

  1. 散值—它的hash值有一点微小的变化,那么它在内存中所存放的位置将发生巨大的变化
  2. 它将set中的每一个hash值都通过hash函数进行计算得到一个巨大的整数然后以16进制表示并翻译成字符显示
  3. 在使用in 时它是先将所要查的数通过hash函数转换为一个巨大的整数,然后直接一步到位,所以它的效率非常高
  4. hash值在内存中是不连续的
  5. 它是先开辟一段属于自己的内存,且如当添加如一个已有的hash值他将自动舍弃(通俗说就是如房间有数据则不进入)
  6. 在set中使用remove的效率极高—它先算hash值 然后一步定位
    幂等性==它在一次程序运行中某字符的hash值是一样的—但是在下一次运行的时候它的值将会改变

集合运算

交集: ( & 或者 intersection )

并集:    ( | 或者 union )

差集:    ( - 或者 difference )

反交集:   ( ^ 或者 symmetric_difference)

子集与超集:( 返回 true 或者 false)