字典集合


可变的数据类型永远都不能做hash

不可变的数据类型才可以做hash



A,字典 

  一,字典的概念

       1,字典以键值对的形式 存在:{key:value}

        2,其中的key值会进行hash运算,生成hash表,所以字典的访问效率要优于普通的序列数据类型(列表,元组)

        3,key值由于需要通过hash,则一些可变的数据类型不可以作为key值,而value值没有限制,可以使任何的数据类型

        4,由于进行了hash运算年,那么在内存中字典其中的数据是无序的,没有办法进行一些像缩影和切片一样的操作

        5,字典为可变数据类型,so不可作为key值

        6,集合是乱序的

 二,创建方式

        1,大括号包裹键值对:变量名 = {键:值,键:值}

               eg:mydict = {1:"a",2:"b"}

        2,工厂方法创建 : 变量名 = dict(([键:值],[键:值]))

                eg:mydict = dict(([1,"a"],[2,"b"]))

        3,字典的内建方法:变量名 = dict.fromkeys([1,2,3,4,5],'a')

            这样可以批量创建key值,但是缺点是无法独立分配value值

        具体操作

            eg:

 三,访问字典

        1,获得所有的key值:dict.keys()

        2,获得所有的value值:dict.values()

        3,迭代获取其中的key值:for key in dict:key    

四,判断是否存在字典中

        1,获取所有的value值:dict.values()

        2,可以使用in还有not in判断是否存在字典中有对应的key值,返回值为bool类型

                eg:

                        

 五,更新字典

        eg:

                


B,集合

    一,集合的概念

        1,集合:把不同的元素组合在一起形成一个数据集合(数据唯一,不会保存两个一样的数据,即去重)

            集合分为两种,可变集合(set),不可变集合(frozenset)

            集合的内部结构和字典类似,但是不存储value,其中的元素也会进行hash运算,可以称得上是一个没有value的字典

     二,创建集合

        1,大括号包裹创建:myset = {1,2,3,4,'abc'}        (这是可变的集合)

        2,工厂方式创建:可变的myset = set([1,2,3,4,5])     和 不可变的frozenset([1,2,3,4,5])

            eg:

                        

        3,访问集合

            1,直接变量名访问

            2,迭代访问集合

                    eg: for var in set :

                                    print(var)

    三,更新集合(仅限于set,而frozenset不可以)

        1,set.add():更新可hash数据类型到集合中,并维持原样()

        2,set.update():如果传入的是一个序列,将被拆分成单个元素,并且去掉重复

            由于集合中的数据元素进行hash运算,可变的数据类型(列表)是不可以进行hash运算的,也就不能传递进来被更新,可变集合支持更新操作,不可变集合不支持该操作    

    四,删除集合中的元素

           1,myset.remove(var)                    

           2,del myset

    五,集合类型操作符

           1,子集和超集(返回值喂bool)

                    a<b  a是b的子集       a.issubset(b)

                    #b含有a中的元素

                      a>b    a是否是b的超集    a.issuperset(b)

                        #超集就代表a中的元素南扩了所有班的集合元素

            2,交并补