1集合set
1.1 概述
集合是无序的,不重复的数据类型,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希的。(所以集合做不了字典的key)
1.2 去重
把以个列表变成一个集合就自动去重了
关系测试:测试两组数据之前的交集,差集,并集等关系。
集合的创建
set1 = set({1,2,'barry'})
set2 = {1,2,'barry'}
set3 = set()
集合的增:
set1 = {'周杰伦','昆凌','张柏芝'}
set1.add('谢霆锋')
print(set1)
>>>{'昆凌', '谢霆锋', '张柏芝', '周杰伦'}
集合的删:
set1 = {'周杰伦','昆凌','张柏芝'}
set1.remove('周杰伦') #删除指定元素
print(set1)
>>>{'昆凌','张柏芝'}
set1.pop() #随机删除一个元素
print(set1)
set1.clear() #清空集合
del set1 #删除集合
1.3 集合的其他操作
交集。(& 或者 intersection)
set1 = {1,2,3,4,5}
set2 = {3,4,5,6,7,8}
print(set1 & set2)
print(set1.intersection(set2))
>>> {3, 4, 5}
>>> {3, 4, 5}
并集。(|或者union)
set1 = {1,2,3,4,5}
set2 = {3,4,5,6,7,8}
print(set1 | set2)
print(set1.union(set2))
>>> {1, 2, 3, 4, 5, 6, 7, 8}
>>> {1, 2, 3, 4, 5, 6, 7, 8}
差集。(-或者difference)
set1 = {1,2,3,4,5}
set2 = {3,4,5,6,7,8}
print(set1 - set2)
print(set1.symmetric_difference(set2))
>>>{1,2}
>>>{1,2}
反交集. (^ 或者 symmetric_difference)
set1 = {1,2,3,4,5}
set2 = {3,4,5,6,7}
print(set1 ^ set2)
print(set1.symmetric_difference(set2))
>>> {1,2,6,7}
>>> {1,2,6,7}
子集与超集.
set1 = {1,2,3}
set2 = {1,2,3,4,5,6}
print(set1 < set2)
print(set1.issubset(set2)) # 这两个相同,都是说明set1是set2子集。
>>>True
>>>True
print(set2 > set1)
print(set2.issuperset(set1)) # 这两个相同,都是说明set2是set1超集。
>>>True
>>>True
frozenset不可变集合,让集合变成不可变类型。
s = frozenset({1,2,3,4,5,1,2,3})
print(s,type(s))
>>> frozenset({1, 2, 3, 4, 5}) <class 'frozenset'>
2 深浅拷贝
copy一词是音译过来的,意思就复制,什么是浅拷贝?复制第一层的元素,或者说复制部分元素,
什么是深拷贝?复制全部元素。用id()来查看内存地址,如果两个变量的内存地址相同,那说名两个变量是同一个。
2.1先看赋值运算
list1 = [1,2,3,['a','b']]
list2 = list1
#用id来查看两个变量的内存地址
print(id(list1),id(list2))
#此时两个元素的内存地址完全相同,如对其中任意0.一个变量进行修改,则两个都会改变
>>>2632658608840 2632658608840
list1[3].append('c')
print(list1,list2)
>>>[1, 2, 3, ['a', 'b', 'c']] [1, 2, 3, ['a', 'b', 'c']]
对于赋值运算来说,list1与list2指向的是同一个内存地址,所以他们是完全一样的,在举个例子,
比如张三李四合租在一起,那么对于客厅来说,他们是公用的,张三可以用,李四也可以用,
但是突然有一天张三把客厅的的电视换成投影了,那么李四使用客厅时,想看电视没有了,而是投影了
,对吧?list1,list2指向的是同一个列表,任何一个变量对列表进行改变,剩下那个变量在使用列表之后,这个列表就是发生改变之后的列表。
2.2浅拷贝copy
list1 = [1,2,3,['a','b']]
list2 = list1.copy()
print(id(list1),id(list2))
print(list1,list2)
#此时可以看到,两个变量值相同,但是id内存地址是不一样的,所以说对其中任意元素的修改都会互不干扰
>>>2075161748168 2075162999368
>>>[1, 2, 3, ['a', 'b']] [1, 2, 3, ['a', 'b']]
lis1.append(4)
print(list1,list2)
>>>[1, 2, 3, ['a', 'b'], 4] [1, 2, 3, ['a', 'b']]
#前文提到浅拷贝copy的是第一层,下面查看列表里面嵌套的列表id
print(id(list1[3]),id(list2[3]))
#此时可以看到,浅拷贝对列表里面嵌套的列表没有copy,内存地址相同,也就是说对嵌套的列表进行操作,两个都会同时改变
>>>1792729309832 1792729309832
list1[3].append('c')
print(lis1,list2)
>>>[1, 2, 3, ['a', 'b', 'c'], 4] [1, 2, 3, ['a', 'b', 'c']]
3.3深拷贝
#需要引入copy模块
import copy
list1 = [1,2,3,['a','b']]
list2 = copy.deepcopy(list1)
#此时list1和list2内存地址完全不同,不管是表层元素还是嵌套的元素
print(id(list1),id(list2))
print(id(list1[3]),id(list2[3]))
print(list1,list2)
#由此可见,不管是对表层元素操作,还是对嵌套元素操作,得到的都是新的,且互不干扰
>>>2922914846152 2922914754504
>>>2922914982152 2922914982472
>>>[1, 2, 3, ['a', 'b']] [1, 2, 3, ['a', 'b']]
lis1.append(4)
lis1[3].append('c')
print(list1,list2)
>>>[1, 2, 3, ['a', 'b', 'c'], 4] [1, 2, 3, ['a', 'b']]
#深拷贝就是完完全全复制了一份,且数据不会互相影响,因为内存不共享