python(集合)

      一、集合:
              集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型)
        ,但是集合本身是不可哈希(可变类型)的。
 
        
        特点:
                1、去重,把一个列表变成集合它会自动去除重复元素。
                2、关系测试,测试两组数据之间的交集、并集、差集等。
              集合的创建:
              直接创建:
                      set2 = {‘test’,1,1}
                      print(set2,type(set2))
 
                      输出:
                      {1, ‘test’} <class ‘set’>
 
              
                  以内置方法创建:
                          set1 = set({1,2,’test’})
                          print(set1,type(set1))
 
                          输出:
                          {1, 2, ‘test’} <class ‘set’>
              集合的增删:
                  增:
                        add:添加
                        set2 = {‘test’,1,}
                        set2.add(‘wenzhe’)
                        print(set2,type(set2))
 
                        输出:
                        {‘test’, 1, ‘wenzhe’} <class ‘set’>

 

                        update:迭代增加,将一个可迭代对象(字符串、列表、元组等)中的单个元素一个一个进行添加
                        set2 = {‘test’,1,}
                        set2.add(‘wenzhe’)
                        set2.update(‘wenxing’)
                        set2.update(‘2’)
                        set2.update([42,3,5])
 
                        print(set2,type(set2))
                        输出:
                        {1, ‘g’, 3, 5, ‘w’, ‘x’, 42, ‘wenzhe’, ‘test’, ‘i’, ‘2’, ‘n’, ‘e’} <class ‘set’>
              删:
                        remove:删除一个元素
                        set2 = {‘test’,1,2,’ccc’}
                        set2.remove(‘test’)
                        print(set2,type(set2))
 
                      输出:
                        {‘ccc’, 1, 2} <class ‘set’>

 

                        pop:随机删除一个元素
                        set2 = {‘test’,1,2,’ccc’}
                        set2.pop()
                        print(set2,type(set2))
 
                        输出:
                        第一次:
                        {1, 2, ‘test’} <class ‘set’>
                        第二次:
                        {2, ‘test’, ‘ccc’} <class ‘set’>

 

                        clear:清空集合(只是清空集合,在内存中还是有这个集合空间的存在。)
                        set2 = {‘test’,1,2,’ccc’}
                        set2.clear()
 
                        输出:
                        set() <class ‘set’>

 

                        del:删除集合(在内存中删除集合)
                        del  set2
 
                        输出:
                        NameError: name ‘set2’ is not defined
                集合的其他操作:
                  1、交集,取重复的值(&或者intersection)
                        set1 = {1,2,3,4,5,6}
                        set2 = {4,5,6,7,8,9}
                        print(set1 & set2)
                        print(set1.intersection(set2))
 
                      输出:
                        {4, 5, 6}
                        {4, 5, 6}

 

                  2、并集,将两个集合去重相加(|或者union)
                        set1 = {1,2,3,4,5,6}
                        set2 = {4,5,6,7,8,9}
 
                        print(set1 | set2)
                        print(set1.union(set2))
 
                        输出:
                        {1, 2, 3, 4, 5, 6, 7, 8, 9}
                        {1, 2, 3, 4, 5, 6, 7, 8, 9}

 

                3、差集(-或者difference)
                        set1 = {1,2,3,4,5,6}
                        set2 = {4,5,6,7,8,9}
 
                        print(set1 – set2)
                        print(set2.difference(set1))
                     #set1-set2:所有属于set1的不属于set2的就是set1和set2之间的差集(set1和set2不同之处。)
 
                        输出:
                        {1, 2, 3}
                        {8, 9, 7}

 

                4、反交集(^或者symmetric_difference)
                        set1 = {1,2,3,4,5,6}
                        set2 = {4,5,6,7,8,9}
 
                        print(set1 ^ set2)
                        print(set2.symmetric_difference(set1))
                        #取set1和set2之间不同的值
 
                        输出:
                        {1, 2, 3, 7, 8, 9}
                        {1, 2, 3, 7, 8, 9}

 

                5、子集与超集:
                        判断子集:
                        set1 = {4,5,6}
                        set2 = {4,5,6,7,8,9}
 
                        print(set1 < set2)
                        print(set1.issubset(set2))
                        #判断set1是否被包含在set2中
 
                        输出:
                        True
                        True
 
 
                        注:
                        set1 = {4,5,6}
                        set2 = {4,5,6}
   
                       print(set1 < set2)
                        print(set1.issubset(set2))
 
                        输出:
                        False
                        True
 
                      #<只有在有相同并且比set1多至少一个元素的情况下才会成立。
 
 
                        判断超集:
                        set1 = {4,5,6}
                        set2 = {4,5,6,7,8,9}
 
 
                        print(set2 > set1)
                        print(set2.issuperset(set1))
                      #判断set2是否包含set1的数据,在使用>的情况下必须是包含切多至少一个数据
                        输出:
                        True
                        True
 
                      #建议最好使用官方内置函数

 

              6、frozenset不可变集合,将集合转为不可变类型
                        set1 = {4,5,6}
 
                        s = frozenset(set1)
                        print(s,type(s))
 
 
                        也可以直接创建一个新的集合为不可变集合:
                        s = frozenset(‘ceshi’)
                        print(s,type(s))
 
                        输出:
                        frozenset({‘c’, ‘s’, ‘h’, ‘i’, ‘e’}) <class ‘frozenset’>

 
 

                二、深浅copy
                  1、例:
                        l1 = [1,2,3,[‘wen’,’jing’],]
                        l2 = l1
 
                        l1[0] = 111
                        print(l1)
 
 
                        输出:
                        [111, 2, 3, [‘wen’, ‘jing’]]
                        [111, 2, 3, [‘wen’, ‘jing’]]
 
                      #对于赋值运算来说因为l1和l2指向的是同一个内存地址,所以对列表进行修改他们两个是同步的。
                      #这是以列表为例,字典、元组等都是同样。
 
 
                  2、浅拷贝copy
                        l1 = [1,2,3,[‘wen’,’jing’]]
                        l2 = l1.copy()
 
                        print(l1,id(l1))
                        print(l2,id(l2))
         
                        输出:
                        [1, 2, 3, [‘wen’, ‘jing’]] 39108232
                        [1, 2, 3, [‘wen’, ‘jing’]] 39133576
 
 
                        l1[1] = 222
                        print(l1,id(l1))
                        print(l2,id(l2))
 
                        输出:
                          [1, 222, 3, [‘wen’, ‘jing’]] 39108232
                          [1, 2, 3, [‘wen’, ‘jing’]] 39133576
 
 
                        l1[-1][0]=’ceshi’
                        print(l1,id(l1))
                        print(l2,id(l2))
 
                        输出:
                        [1, 222, 3, [‘ceshi’, ‘jing’]] 39108232
                        [1, 2, 3, [‘ceshi’, ‘jing’]] 39133576
 
 
                      #对于浅copy来说第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。
 
                3、深拷贝deepcopy
                        import copy
 
                        l1 = [1,2,3,[‘wen’,’jing’]]
                        l2 = copy.deepcopy(l1)
 
                        print(l1,id(l1))
                        print(l2,id(l2))
 
                        输出:
                        [1, 2, 3, [‘wen’, ‘jing’]] 50066760
                       [1, 2, 3, [‘wen’, ‘jing’]] 50067464
 
 
                        l1[1] = 222
                        print(l1,id(l1))
                        print(l2,id(l2))
 
                        输出:
                          [1, 222, 3, [‘wen’, ‘jing’]] 44229960
                          [1, 2, 3, [‘wen’, ‘jing’]] 44230664
 
 
                        l1[-1][0]=’ceshi’
                       print(l1,id(l1))
                        print(l2,id(l2))
 
                        输出:
                        [1, 2, 3, [‘ceshi’, ‘jing’]] 50849096
                       [1, 2, 3, [‘wen’, ‘jing’]] 50849800
     
                      #对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个也不会改变。

 

 
posted @ 2018-04-24 10:02  zhangliang666  阅读(153)  评论(0编辑  收藏  举报