集合的定义
- 集合只能用set函数来定义一个空集合
- 如 :set_ = set()
set元素
- set的元素要求必须可以hash
- 元素不可以使用索引
- set可以迭代
- 切片只能在线性结构中使用、set函数可以遍历可迭代对象
- set自动去重
- 注意列表,bytearray,set,字典(可变类型都不可)等是不可哈希类型—不能存放在set中
注意它在确定是否是哈希类型时它将set中的所有元素都先查一遍包括set中容器中的元素 - 哈希函数—hash()用来确定是否可以哈希(哈希值一旦确定下来不能在改变)
set增加
- add(elem)–增加一个元素到set中 如果元素存在则什么都不做 注意:一次只能追加一个
- update(*others)
1.合并其他元素到set集合中来
2.参数必须是可迭代对象
3.就地修改
set删除
- remove()移除一个元素,没有则抛异常
- discare()移除一个元素,如果不存在则什么也不做
- pop()因为集合无序所以随机删除一个,空集合则报错
- clear()清空所有元素
- Set—集合中使用in效率非常快—是因为它是可hash的—它的时间复杂度为O(1)
列表等是不可hash的所以它的时间复杂度为O(n)
set修改,查询
- 修改
1.要么删除,要么加如新的元素 - 查询:非线性结构,无法索引
- 遍历:可迭代所有元素
- 成员运算符:in 和 not in 判断元素是否在set中,效率高
hash原理
hash—原理
- 散值—它的hash值有一点微小的变化,那么它在内存中所存放的位置将发生巨大的变化
- 它将set中的每一个hash值都通过hash函数进行计算得到一个巨大的整数然后以16进制表示并翻译成字符显示
- 在使用in 时它是先将所要查的数通过hash函数转换为一个巨大的整数,然后直接一步到位,所以它的效率非常高
- hash值在内存中是不连续的
- 它是先开辟一段属于自己的内存,且如当添加如一个已有的hash值他将自动舍弃(通俗说就是如房间有数据则不进入)
- 在set中使用remove的效率极高—它先算hash值 然后一步定位
幂等性==它在一次程序运行中某字符的hash值是一样的—但是在下一次运行的时候它的值将会改变
集合运算
交集: ( & 或者 intersection )
并集: ( | 或者 union )
差集: ( - 或者 difference )
反交集: ( ^ 或者 symmetric_difference)
子集与超集:( 返回 true 或者 false)