内置数据结构set

    定义:
        可变的、无序的、不重复的元素的集合.
        常用于: 去重
    set是可迭代对象
    set中的元素必须是可hash的
    set中的值不能通过索引访问
  • set定义,初始化

        set() -> new empty set object
        set(iterable) -> new set object
    
        注意:
            定义set时,可用{}来表示,但不能为空
        如下:
            >>> type({})      # '{}'表示定义的是dict
            <class 'dict'>
            >>> type({1})     
            <class 'set'>


  • set方法


    • 增 

          add(elem)
          添加一个元素至set
      
          update(*others)
          将可迭代对象添加至set



    •     remove(elem)
          删除set中指定的元素,如果找不到抛出KeyError
      
          discard(elem) 
          删除set中指定的元素,如果找不到,就什么都不做
      
          pop() --> elem
          随机弹出set中某元素,并输出至标准输出
          如果找不到抛出KeyError
      
          clear()
          清空set内所有元素
      
          问: 为什么抛出的异常是KeyError,而不是ValueError?
          说明set是通过Key来查询值是否存在,而不是通过value的对比.



    •     非线性结构,无法索引



    •     修改,还不如直接删除,再增一个新元素


  • set成员运算符比较

        比较set和list查询效率:
        lst1 = list(range(100))
        lst2 = list(range(1000000))
        -1 in lst1、-1 in lst2     # 使用此语句测试效率
        s1 = set(range(100))
        s2 = set(range(1000000))
        -1 in s1、-1 in s2         # 使用此语句测试效率
    
        测试结果:
            list相差数量级的倍数
            set相差无几


  • set和线性结构

        线性结构在查询效率方面,查询的数据的量级越大,所消耗的时间则会越多.
        set、dict等,内部使用hash作为key,在查询上时间复杂度为O(1).即查询时间,跟数据量级无关.


  • 可hash对象

        整型
        字符型
        tuple
        None
        bytes(保存的是对应的字符编码)   

        使用内置的hash()函数来判断此对象是否是可hash的.

        例:
            >>> hash([1])          # 列表不可hash
            Traceback (most recent call last):
              File "<stdin>", line 1, in <module>
            TypeError: unhashable type: 'list'