python(集合)
一、集合:
集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型)
,但是集合本身是不可哈希(可变类型)的。
特点:
1、去重,把一个列表变成集合它会自动去除重复元素。
2、关系测试,测试两组数据之间的交集、并集、差集等。
集合的创建:
直接创建:
set2 = {‘test’,1,1}
print(set2,type(set2))
输出:
{1, ‘test’} <class ‘set’>
以内置方法创建:
set1 = set({1,2,’test’})
print(set1,type(set1))
输出:
{1, 2, ‘test’} <class ‘set’>
集合的增删:
增:
add:添加
set2 = {‘test’,1,}
set2.add(‘wenzhe’)
print(set2,type(set2))
输出:
{‘test’, 1, ‘wenzhe’} <class ‘set’>
update:迭代增加,将一个可迭代对象(字符串、列表、元组等)中的单个元素一个一个进行添加
set2 = {‘test’,1,}
set2.add(‘wenzhe’)
set2.update(‘wenxing’)
set2.update(‘2’)
set2.update([42,3,5])
print(set2,type(set2))
输出:
{1, ‘g’, 3, 5, ‘w’, ‘x’, 42, ‘wenzhe’, ‘test’, ‘i’, ‘2’, ‘n’, ‘e’} <class ‘set’>
删:
remove:删除一个元素
set2 = {‘test’,1,2,’ccc’}
set2.remove(‘test’)
print(set2,type(set2))
输出:
{‘ccc’, 1, 2} <class ‘set’>
pop:随机删除一个元素
set2 = {‘test’,1,2,’ccc’}
set2.pop()
print(set2,type(set2))
输出:
第一次:
{1, 2, ‘test’} <class ‘set’>
第二次:
{2, ‘test’, ‘ccc’} <class ‘set’>
clear:清空集合(只是清空集合,在内存中还是有这个集合空间的存在。)
set2 = {‘test’,1,2,’ccc’}
set2.clear()
输出:
set() <class ‘set’>
del:删除集合(在内存中删除集合)
del set2
输出:
NameError: name ‘set2’ is not defined
集合的其他操作:
1、交集,取重复的值(&或者intersection)
set1 = {1,2,3,4,5,6}
set2 = {4,5,6,7,8,9}
print(set1 & set2)
print(set1.intersection(set2))
输出:
{4, 5, 6}
{4, 5, 6}
2、并集,将两个集合去重相加(|或者union)
set1 = {1,2,3,4,5,6}
set2 = {4,5,6,7,8,9}
print(set1 | set2)
print(set1.union(set2))
输出:
{1, 2, 3, 4, 5, 6, 7, 8, 9}
{1, 2, 3, 4, 5, 6, 7, 8, 9}
3、差集(-或者difference)
set1 = {1,2,3,4,5,6}
set2 = {4,5,6,7,8,9}
print(set1 – set2)
print(set2.difference(set1))
#set1-set2:所有属于set1的不属于set2的就是set1和set2之间的差集(set1和set2不同之处。)
输出:
{1, 2, 3}
{8, 9, 7}
4、反交集(^或者symmetric_difference)
set1 = {1,2,3,4,5,6}
set2 = {4,5,6,7,8,9}
print(set1 ^ set2)
print(set2.symmetric_difference(set1))
#取set1和set2之间不同的值
输出:
{1, 2, 3, 7, 8, 9}
{1, 2, 3, 7, 8, 9}
5、子集与超集:
判断子集:
set1 = {4,5,6}
set2 = {4,5,6,7,8,9}
print(set1 < set2)
print(set1.issubset(set2))
#判断set1是否被包含在set2中
输出:
True
True
注:
set1 = {4,5,6}
set2 = {4,5,6}
print(set1 < set2)
print(set1.issubset(set2))
输出:
False
True
#<只有在有相同并且比set1多至少一个元素的情况下才会成立。
判断超集:
set1 = {4,5,6}
set2 = {4,5,6,7,8,9}
print(set2 > set1)
print(set2.issuperset(set1))
#判断set2是否包含set1的数据,在使用>的情况下必须是包含切多至少一个数据
输出:
True
True
#建议最好使用官方内置函数
6、frozenset不可变集合,将集合转为不可变类型。
set1 = {4,5,6}
s = frozenset(set1)
print(s,type(s))
也可以直接创建一个新的集合为不可变集合:
s = frozenset(‘ceshi’)
print(s,type(s))
输出:
frozenset({‘c’, ‘s’, ‘h’, ‘i’, ‘e’}) <class ‘frozenset’>
二、深浅copy
1、例:
l1 = [1,2,3,[‘wen’,’jing’],]
l2 = l1
l1[0] = 111
print(l1)
输出:
[111, 2, 3, [‘wen’, ‘jing’]]
[111, 2, 3, [‘wen’, ‘jing’]]
#对于赋值运算来说因为l1和l2指向的是同一个内存地址,所以对列表进行修改他们两个是同步的。
#这是以列表为例,字典、元组等都是同样。
2、浅拷贝copy
l1 = [1,2,3,[‘wen’,’jing’]]
l2 = l1.copy()
print(l1,id(l1))
print(l2,id(l2))
输出:
[1, 2, 3, [‘wen’, ‘jing’]] 39108232
[1, 2, 3, [‘wen’, ‘jing’]] 39133576
l1[1] = 222
print(l1,id(l1))
print(l2,id(l2))
输出:
[1, 222, 3, [‘wen’, ‘jing’]] 39108232
[1, 2, 3, [‘wen’, ‘jing’]] 39133576
l1[-1][0]=’ceshi’
print(l1,id(l1))
print(l2,id(l2))
输出:
[1, 222, 3, [‘ceshi’, ‘jing’]] 39108232
[1, 2, 3, [‘ceshi’, ‘jing’]] 39133576
#对于浅copy来说第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。
3、深拷贝deepcopy
import copy
l1 = [1,2,3,[‘wen’,’jing’]]
l2 = copy.deepcopy(l1)
print(l1,id(l1))
print(l2,id(l2))
输出:
[1, 2, 3, [‘wen’, ‘jing’]] 50066760
[1, 2, 3, [‘wen’, ‘jing’]] 50067464
l1[1] = 222
print(l1,id(l1))
print(l2,id(l2))
输出:
[1, 222, 3, [‘wen’, ‘jing’]] 44229960
[1, 2, 3, [‘wen’, ‘jing’]] 44230664
l1[-1][0]=’ceshi’
print(l1,id(l1))
print(l2,id(l2))
输出:
[1, 2, 3, [‘ceshi’, ‘jing’]] 50849096
[1, 2, 3, [‘wen’, ‘jing’]] 50849800
#对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个也不会改变。