数据类型之集合

一、集合的作用

    主要作用就是关系运算和去重,与列表(list)、元组(tuple)、字典(dict)一样都可以存放多个值

二、集合的定义

  定义:在{}内用逗号分隔开多个元素,集合具备以下三个特点:

               1:每个元素必须是不可变类型

               2:集合内没有重复的元素

              3:集合内元素无序

   s {1,2,3,4# 本质 s = set({1,2,3,4})

注意1:列表类型是索引对应值,字典是key对应值,均可以取得单个指定的值,而集合类型既没有索引也没有key与值对应,所以无法取得单个的值,而且对于集合来说,主要用于去重与关系元素,根本没有取出单个指定值这种需求身份手动阀。
注意2:{}既可以用于定义dict,也可以用于定义集合,但是字典内的元素必须是key:value的格式,现在我们想定义一个空字典和空集合,该如何准确去定义两者?
 d = {} # 默认是空字典 
 s = set() # 这才是定义空集合

三、数据类型

  注意:但凡能被for循环的遍历的数据类型(强调:遍历出的每一个值都必须为不可变类型)都可以传给set()转换成集合类型

             s = set([1, 2, 3, 4])

    s1 = set((1, 2, 3, 4))

    s2 = set({'name': 'jason'})

    s3 = set('egon')

    print(s,s1,s2,s3)

  输出结果:{1, 2, 3, 4} {1, 2, 3, 4} {'name'} {'n', 'e', 'g', 'o'}

四、内置方法

  1、关系运算:&取交集、|取并集、-取差集、^取对称差集

    注意:下面的关系运算可以用符号进行,也有相应的方法进行

    定义两个集合:friends1 =  {"zero","kevin","jason","egon"}

           friends2 = {"Jy","ricky","jason","egon"}

    1.1 用&取交集:取出friends1和friends2相同的值

      print(friends1 & friends2)

      print(friends1.intersection(friends2))

      输出结果:{'jason', 'egon'}

    1.2 用 | 取并集:取出friends1和friends2所有的值,相同的值至保留一个

      print(friends1 | friends2)

      print(friends1.union(friends2))

      输出结果:{'Jy', 'jason', 'egon', 'kevin', 'zero', 'ricky'}

    1.3 用 - 取差集:取出friends1独有的值合取出friends2独有的值

      注意:取差集时需要取出的值必须放在前面

      print(friends1 - friends2)

      print(friends1.difference(friends2))

      输出结果:{'zero', 'kevin'}

      print(friends2 - friends1)

      print(friends1.difference(friends2))

      输出结果:{'Jy', 'ricky'}

    1.4 用 ^ 取对称差集:取出friends1和friends2独有的值(去掉他们共有的值)

      print(friends1 ^ friends2)

      print(friends1.symmetric_difference(friends2))

      输出结果:{'zero', 'ricky', 'kevin', 'Jy'}

    1.5 父子集:一个集合是否包含另一个集合(一个集合包含另一个集合为父子,如果相同它们互为父子)

      包含则返回True,不包含则返回False

      案例:

       friends1 = {"zero","kevin","jason","egon"}

       friends2 = {"zero","kevin","jason"}

       print(friends1 > friends2)   #friends1 包含friends2,表示friends1 是friends2的父亲,则返回True

       print(friends1.issuperset(friends2))

       输出结果:True

       print(friends2 < friends1)  #friends2不包含friends1,表示friends2是friends1的儿子,则返回True

       print(friends2.issubset(friends1))

       输出结果:False

       print(friends1 == friends2)  #如果friends1和friends2集合中的值一样,表示他们互为父子,则返回True

       print(friends2.issubset(friends1))   # 表示friends2是friends1的父亲

       print(friends1.issubset(friends2))   #表示friends1是friends2的父亲

       输出结果:True

  2、去重:集合去重有局限性(该知识点了解)

    2.1、只能针对不可变类型去重

    2.2、无法保证顺序

    案例:

      l=['a','b',1,'a','a']  # l中都是不可变类型

      s = set(l) #把l转为为集合

      print(s)

      输出结果:{1, 'a', 'b'}  #去重后打乱了原来的顺序

    2.3、针对可变类型去重,并且需要保证原来顺序(需要自己写代码实现,python中没有提供)

      案例:

                            # l为列表,是可变类型

        l=[                  

             {'name':'lili','age':18,'sex':'male'},

             {'name':'jack','age':73,'sex':'male'},

            {'name':'tom','age':20,'sex':'female'},

            {'name':'lili','age':18,'sex':'male'},

         {'name':'lili','age':18,'sex':'male'}

        ]

       res = []  #定义一个空列表

       for x in l :  #循环遍历l中的值,放到x中

         if x not in res:  # x的值不在res这个空列表中,则进行以下操作

           res.append(x)  #把x的值加入到res这个空列表中

       print(res)

       输出结果:[{'name': 'lili', 'age': 18, 'sex': 'male'}, {'name': 'jack', 'age': 73, 'sex': 'male'}, {'name': 'tom', 'age': 20, 'sex': 'female'}]

  3、其他内置方法:需要掌握的为discard()、update()、pop()、add(),其他的均了解即可

    1、discard():删除掉集合中的元素,如果存在集合中就删除,如果不存在就不做任务事情,

      注:同remove()删除一样,但是remove()删除不存在的元素会报错,所以iscard()方法更健壮

    案例:

     res = {1,2,3}

     res.discard(3)

     print(res)

     输出结果:{1,2}

    2、update():把新的值加入到原来集合中,但是重复的会去掉

      案例:

        res = {1,2,3}

        res.update({1,2,5})

        print(res)

        输出结果:{1,2,3,5}

    3、isdisjoint():比较两个集合,如果完全独立(没有交集),返回True

      案例:

        res = {1,2,3}

        res1 = {4,5,6,7}

        l = res.isdisjoint(res1)

        输出结果:True

    4.difference_update():求差集,并重新赋值

      案例:

        res = {1,2,3}

        res1 = {3,4,6,7}

        res.difference_update(res1)  #等同于res3 = res.difference_update(res1),但是这样的话输出为none

        print(res)

        输出结果:{1,2}

    5、pop():随机删除集合中的元素

      案例:

        res = {20,21,22,24,19,6,7,8,9,13,11,12,14,16,18,"a"}

        res.pop()

        print(res)  #随机删除集合中的一个元素

     6、add():添加一个元素到集合中

      案例:

        res = {20,21,22,24,19,6,7,8,9,13,11,12,14,16,18,"a"}

        res.add("xialiang")

        print(res)

        输出结果:{6, 7, 8, 9, 11, 12, 13, 14, 'xialiang', 16, 18, 19, 20, 21, 22, 24, 'a'}

posted @ 2020-12-04 00:38  A熙  阅读(530)  评论(0)    收藏  举报