python--集合深浅copy

Posted doumingyi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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--集合深浅copy的主要内容,如果未能解决你的问题,请参考以下文章

python-- 深浅copy集合

python之集合深浅copy文件操作函数初识

Python的深浅copy

python--集合深浅copy

python集合深浅copy

骑士计划-python全栈07 集合,深浅copy(copy,deepcopy)