一、集合集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合坐不了字典的键)的。以下是集合最重要的两点:1、去重:把一个列
一、集合
集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合坐不了字典的键)的。
以下是集合最重要的两点:
1、去重:把一个列表变成集合,就去重了
2、关系测试:测试两组数据之前的交集、差集、并集等关系
1、集合的创建:
set1 = set({1,2,'barry'}) set2 = {1,2,'barry'} print(set1) print(set2)
{1, 2, 'barry'}
{1, 2, 'barry'}
2、集合的增
set1 = {'alex','wusir','ritian','egon','barry'} set1.add('景女神') print(set1) #update:迭代着增加
set1.update('A') print(set1) set1.update('老师') print(set1) set1.update([1,2,3]) print(set1)
{'wusir', '景女神', 'ritian', 'alex', 'barry', 'egon'} {'wusir', '景女神', 'ritian', 'A', 'alex', 'barry', 'egon'} {'wusir', '老', '景女神', '师', 'ritian', 'A', 'alex', 'barry', 'egon'} {1, 2, 3, 'wusir', '老', '景女神', '师', 'ritian', 'A', 'alex', 'barry', 'egon'}
3、集合的删除
set1 = {'alex','wusir','ritian','eqon','barry'} print(set1) #删除一个元素
set1.remove('alex') print(set1) #删除第一个元素
set1.pop() print(set1) #清空集合
set1.clear() print(set1) del set1 #删除集合
print(set1)
{'ritian', 'wusir', 'alex', 'barry', 'eqon'} {'ritian', 'wusir', 'barry', 'eqon'} {'wusir', 'barry', 'eqon'} set() Traceback (most recent call last): File "D:/pythonStudy12/day02/05.py", line 32, in
print(set1) NameError: name 'set1' is not defined
4、集合的其他操作:交集(& 或 intersection)、并集(| 或 union)、差集(- 或 difference)、反交集(^ 或 sysmmertric_difference)、子集、超集
set1 = {1,2,3,4,5} set2 = {4,5,6,7,8}
print("交集:") print(set1 & set2) print(set1.intersection(set2)) print("并集:") print(set1 | set2) print(set1.union(set2)) print("差集:") print(set1 - set2) print(set1.difference(set2)) print("交反集:") print(set1 ^ set2) print(set1.symmetric_difference(set2))
交集: {4, 5} {4, 5} 并集: {1, 2, 3, 4, 5, 6, 7, 8} {1, 2, 3, 4, 5, 6, 7, 8} 差集: {1, 2, 3} {1, 2, 3} 交反集: {1, 2, 3, 6, 7, 8} {1, 2, 3, 6, 7, 8}
#超集、子集
set1 = {1,2,3} set2 = {1,2,3,4,5,6} #set1是set2子集
print(set1 < set2) print(set1.issubset(set2)) #set2是set1超集
print(set2 > set1) print(set2.issuperset(set1))
5、frozenset不可变集合,让集合变成不可变类型
s = frozenset('barry') print(s,type(s))
frozenset({'b', 'r', 'a', 'y'}) <class 'frozenset'>
二、深浅拷贝
1、赋值运算
对于赋值运算来说,l1与l2指向的是同一个内存地址,所以他们是完全一样的
![](https://img1.php1.cn/3cd4a/24f51/243/0db937d1d8cfdcc9.jpeg)
l1 = [1,2,3,['barry','alex']] l2 = l1 l1[0] = 111
print(l1) print(l2) l1[3][0] = 'wusir'
print(l1) print(l2)
[111, 2, 3, ['barry', 'alex']] [111, 2, 3, ['barry', 'alex']] [111, 2, 3, ['wusir', 'alex']] [111, 2, 3, ['wusir', 'alex']]
2、浅拷贝:copy
对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性
![](https://img1.php1.cn/3cd4a/24f51/243/e615c0202e3929b4.jpeg)
![](https://img1.php1.cn/3cd4a/24f51/243/c95df583d71e8c44.jpeg)
l1 = [1,2,3,['barry','alex']] l2 = l1.copy() print(l1,id(l1)) print(l2,id(l2)) l1[1] = 222
print(l1,id(l1)) print(l2,id(l2)) l1[3][0] = 'wusir'
print(l1,id(l1)) print(l2,id(l2))
[1, 2, 3, ['barry', 'alex']] 35640712
[1, 2, 3, ['barry', 'alex']] 35640840 [1, 222, 3, ['barry', 'alex']] 35640712 [1, 2, 3, ['barry', 'alex']] 35640840 [1, 222, 3, ['wusir', 'alex']] 35640712 [1, 2, 3, ['wusir', 'alex']] 35640840
3、深拷贝:deepcopy
对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变
![](https://img1.php1.cn/3cd4a/24f51/243/42bc663795fe2f94.jpeg)
import copy l1 = [1, 2, 3, ['barry', 'alex']] l2 = copy.deepcopy(l1) print(l1,id(l1)) print(l2,id(l2)) l1[1] = 222
print(l1,id(l1)) print(l2,id(l2)) l1[3][0] = 'wusir'
print(l1,id(l1)) print(l2,id(l2))
[1, 2, 3, ['barry', 'alex']] 42286728 [1, 2, 3, ['barry', 'alex']] 42451912
[1, 222, 3, ['barry', 'alex']] 42286728 [1, 2, 3, ['barry', 'alex']] 42451912
[1, 222, 3, ['wusir', 'alex']] 42286728 [1, 2, 3, ['barry', 'alex']] 42451912