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
深浅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
2、列表、元组、字典copy:
赋值(=)
赋值只是创建一个变量,该变量指向原来的内存地址
>>> name1 = ['a','b',['m','n'],'c'] >>> name2 = name1 #输出结果,两个内存地址是一样的 >>> print(id(name1),',',id(name2)) #输出结果 47943432 , 47943432
浅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
深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