zoukankan      html  css  js  c++  java
  • python--集合、深浅copy

    集合

    集合是无序的,天生不重复的数据组合,它的作用如下:

    • 去重,即:把一个列表变成集合,就去重了
    • 关系测试,即:测试两组集合的交集、并集和差集等

    可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

    parame = {value01,value02,...}
    或者
    set(value)

    一、关系测试 

    1、交集(intersection())、交集(&)

    >>> name_1 = [1,2,3,4,7,8,7,10]
    >>> name_2 = [1,3,5,8,10]
    >>> name_1 = set(name_1)
    >>> name_2 = set(name_2)
    >>> print(name_1.intersection(name_2))# name_1 & name_2
    #输出结果
    {8, 1, 10, 3}

    2、并集(union())、并集(|)

    >>> name_1 = [1,2,3,4,7,8,7,10]
    >>> name_2 = [1,3,5,8,10]
    >>> name_1 = set(name_1)
    >>> name_2 = set(name_2)
    >>> print(name_1.union(name_2))# name_1 | name_2
    #输出结果
    {1, 2, 3, 4, 5, 7, 8, 10}

     3、差集(difference())、差级(-)

    >>> name_1 = [1,2,3,4,7,8,7,10]
    >>> name_2 = [1,3,5,8,10]
    >>> name_1 = set(name_1)
    >>> name_2 = set(name_2)
    >>> print(name_1.difference(name_2))# name_1 - name_2
    #输出结果
    {2, 4, 7}

     注:差集取的是数值在第一个集合中,但是不在第二个集合中(在我不在你)

    4、对称差集(symmetric_difference())、对称差集(^)

     把两个集合没有交集的数值取出来

    >>> name_1 = [1,2,3,4,7,8,7,10]
    >>> name_2 = [1,3,5,8,10]
    >>> name_1 = set(name_1)
    >>> name_2 = set(name_2)
    >>> print(name_1.symmetric_difference(name_2))# name_1 ^ name_2
    #输出结果
    {2, 4, 5, 7}

    5、issubset()、是否是子集(<=)

    判断一个集合是否是另一个集合的子集

    >>> name_1 = [1,2,3,4,7,8,7,10]
    >>> name_2 = [1,3,5,8,10]
    >>> name_3 = [1,2,3,4]
    >>> name_1 = set(name_1)
    >>> name_2 = set(name_2)
    >>> name_3 = set(name_3)
    >>> print(name_1.issubset(name_2))# name_1 <=  name_2
    #输出结果
    False
    >>> print(name_3 <= name_1)# name_3.issubset(name_1))
    #输出结果
    True

    6、issuperset()、是否是父集(>=)

    判断一个集合是否是另一个集合的父集

    >>> name_1 = [1,2,3,4,7,8,7,10]
    >>> name_2 = [1,3,5,8,10]
    >>> name_3 = [1,2,3,4]
    >>> name_1 = set(name_1)
    >>> name_2 = set(name_2)
    >>> name_3 = set(name_3)
    >>> print(name_1.issuperset(name_2))# name_1 >=  name_2
    #输出结果
    False
    >>> print(name_1 >= name_3)# name_1.issuperset(name_3))
    #输出结果
    True

    7、isdisjoint()

    判断两个集合是否有交集,没有交集,则返回True

    >>> name_1 = [1,2,3,4,7,8,7,10]
    >>> name_2 = [1,3,5,8,10]
    >>> name_3 = [11]
    >>> name_1 = set(name_1)
    >>> name_2 = set(name_2)
    >>> name_3 = set(name_3)
    >>> print(name_1.isdisjoint(name_2))
    #输出结果:有交集
    False
    >>> print(name_1.isdisjoint(name_3))
    #输出结果:无交集
    True

    二、 集合基本操作(增删改查)

      1 #添加(add())
      2 >>> name_1 = [1,3,5,8,10]
      3 >>> name_1 = set(name_1)
      4 #添加已存在,不报错
      5 >>> name_1.add(1)
      6 >>> print(name_1)
      7 #输出结果
      8 {1, 3, 5, 8, 10}
      9 #添加不存在,添加一个新的数值
     10 >>> name_1.add(11)
     11 >>> print(name_1)
     12 #输出结果
     13 {1, 3, 5, 8, 10, 11}
     14 
     15 
     16 #-----------------------------------------------------------------------------------
     17 
     18 
     19 #添加多项(update())
     20 >>> name_1 = [1,3,5,8,10]
     21 >>> name_1 = set(name_1)
     22 >>> name_1.update([12,13,14])
     23 #输出结果
     24 >>> print(name_1)
     25 {1, 3, 5, 8, 10, 12, 13, 14}
     26 
     27 
     28 #-----------------------------------------------------------------------------------
     29 
     30 
     31 #删除(remove(),pop(),discard())
     32 #1、remove()
     33 >>> name_1 = [1,3,5,8,10]
     34 >>> name_1 = set(name_1)
     35 >>> print(name_1)
     36 #输出结果
     37 {1, 3, 5, 8, 10}
     38 
     39 >>> name_1.remove(1)
     40 >>> print(name_1)
     41 #输出结果
     42 {3, 5, 8, 10}
     43 
     44 #删除不存在的元素,会报错
     45 >>> name_1.remove(1)
     46 Traceback (most recent call last):
     47   File "<input>", line 1, in <module>
     48 KeyError: 1
     49  注:用remove删除时,当元素不存在,会报错
     50 
     51 #-----------------------------------------------------------------------------------
     52 
     53 
     54 #2、pop()
     55 >>> name_1 = [1,3,5,8,10]
     56 >>> name_1 = set(name_1)
     57 >>> print(name_1)
     58 #输出结果
     59 {1, 3, 5, 8, 10}
     60 >>> print(name_1.pop())
     61 #输出结果
     62 8
     63 注:pop是随机删除集合中的某个元素,并且打印
     64 
     65 
     66 #-----------------------------------------------------------------------------------
     67 
     68 
     69 #3 discard()
     70 >>> name_1 = [1,3,5,8,10]
     71 >>> name_1 = set(name_1)
     72 >>> name_1.discard(10)
     73 >>> print(name_1)
     74 #输出结果
     75 {1, 3, 5, 8}
     76 
     77 #删除不存在元素,不报错
     78 >>> name_1.discard(10)
     79 >>> print(name_1)
     80 #输出结果
     81 {1, 3, 5, 8}
     82 注:用discard删除不存在的元素,不会出现报错
     83 
     84 
     85 #-----------------------------------------------------------------------------------
     86 
     87 
     88 #长度(len())
     89 >>> name_1 = [1,2,3,4,7,8,7,10]
     90 >>> name_1 = set(name_1)
     91 >>> print(len(name_1))
     92 #结果输出
     93 7
     94 
     95 
     96 #-----------------------------------------------------------------------------------
     97 
     98 
     99 #x in s(测试 x 是否是 s 的成员)
    100 >>> name_1 = [1,2,3,4,7,8,7,10]
    101 >>> name_1 = set(name_1)
    102 #结果输出
    103 >>> print(1 in name_1)
    104 True
    105 
    106 
    107 #-----------------------------------------------------------------------------------
    108 
    109 
    110 #x not in s(测试 x 是否不是 s 的成员)
    111 >>> name_1 = [1,2,3,4,7,8,7,10]
    112 >>> name_1 = set(name_1)
    113 #输出
    114 >>> print(12 not in name_1)
    115 True
    View Code

    深浅copy

    1、数字、字符串的copy:

    赋值(=)、浅拷贝(copy)和深拷贝(deepcopy)其实都一样,因为它们永远指向同一个内存地址:

     1 >>> import copy
     2 
     3 >>> n1 =123
     4 >>> print(id(n1)) #打印n1的内存地址
     5 1442868224
     6 
     7 #赋值
     8 >>> n2=n1
     9 >>> print(id(n2))
    10 1442868224
    11 
    12 #浅拷贝
    13 >>> n3=copy.copy(n1)
    14 >>> print(id(n3))
    15 1442737152
    16 
    17 #深拷贝
    18 >>> n4=copy.deepcopy(n1)
    19 >>> print(id(n4))
    20 1442737152
    View Code

    2、列表、元组、字典copy:

    赋值(=)

    赋值只是创建一个变量,该变量指向原来的内存地址

    >>> name1 = ['a','b',['m','n'],'c']
    >>> name2 = name1
    #输出结果,两个内存地址是一样的
    >>> print(id(name1),',',id(name2))
    #输出结果
    47943432 , 47943432
    View Code

    浅copy:

    浅拷贝是指在内存地址中,只拷贝出第一层的内存的地址中的内容形成一个新的地址,第二层还是共用同一个内存地址:

     1 >>> import copy
     2 >>> name1 = ['a','b',['m','n'],'c']
     3 #浅copy
     4 >>> name2 = copy.copy(name1)
     5 >>> print(name1,',',id(name1))
     6 #输出结果
     7 ['a', 'b', ['m', 'n'], 'c'] , 56069936
     8 >>> print(name2,',',id(name2))
     9 #输出结果
    10 ['a', 'b', ['m', 'n'], 'c'] , 50920008
    11 #修改列表中的元素
    12 
    13 >>> name1[0] = 'h'
    14 >>> name1[2][0] = 'M'
    15 >>> print(name1,',',id(name1))
    16 #输出结果
    17 ['h', 'b', ['M', 'n'], 'c'] , 56069936
    18 >>> print(name2,',',id(name2))
    19 #输出结果
    20 ['a', 'b', ['M', 'n'], 'c'] , 50920008
    View Code

    深copy:

    浅拷贝是指在内存地址中,拷贝name1第一层和第二层内存地址中的内容形成一个name2的两个新内存地址,两者内存地址不一致,所以无交集

     1 >>> import copy
     2 >>> name1 = ['a','b',['m','n'],'c']
     3 #深拷贝
     4 >>> name2 = copy.deepcopy(name1)
     5 >>> print(name1,',',id(name1))
     6 #输出结果
     7 ['a', 'b', ['m', 'n'], 'c'] , 53306272
     8 >>> print(name2,',',id(name2))
     9 #输出结果
    10 ['a', 'b', ['m', 'n'], 'c'] , 53305512
    11 
    12 >>> name1[0] = 'h'
    13 >>> name1[2][0] = 'M'
    14 >>> print(name1,id(name1),id(name1[2][0]))
    15 #输出结果
    16 ['h', 'b', ['M', 'n'], 'c'] 10642336 10421024
    17 >>> print(name2,id(name2),id(name2[2][0]))
    18 #输出结果
    19 ['a', 'b', ['m', 'n'], 'c'] 10641576 9938656
    View Code
  • 相关阅读:
    python数字图像处理(13):基本形态学滤波
    python数字图像处理(12):基本图形的绘制
    python数字图像处理(11):图像自动阈值分割
    python数字图像处理(10):图像简单滤波
    python数字图像处理(9):直方图与均衡化
    python数字图像处理(8):对比度与亮度调整
    python数字图像处理(7):图像的形变与缩放
    android --- api json数据
    android -------- Hawk数据库
    android -------- 沉浸式状态栏和沉浸式导航栏(ImmersionBar)
  • 原文地址:https://www.cnblogs.com/doumingyi/p/12444819.html
Copyright © 2011-2022 走看看