一、集合
集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合坐不了字典的键)的。
以下是集合最重要的两点:
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 <module>
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))
True
True
True
True
5、frozenset不可变集合,让集合变成不可变类型
s = frozenset('barry')
print(s,type(s))
frozenset({'b', 'r', 'a', 'y'}) <class 'frozenset'>
二、深浅拷贝
1、赋值运算
对于赋值运算来说,l1与l2指向的是同一个内存地址,所以他们是完全一样的
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来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性
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来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变
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