很好用的python set
为什么要在python中使用set?
一个字:快。
1.python set的基本使用方法
和list大致类似,详见参考文献1.
方法 | 功能 |
---|---|
set() | 初始化 |
len(s) | 集合s中元素的数量 |
add(elem) | 将元素 elem 添加到集合 |
remove(elem)) | 从集合中移除元素 elem。 如果 elem 不存在于集合中则会引发 KeyError |
discard(elem) | 如果元素 elem 存在于集合中则将其移除 |
pop() | 从集合中移除并返回任意一个元素。 如果集合为空则会引发 KeyError |
clear() | 从集合中移除所有元素 |
1.python set 支持的对象
1.1 set可针对一维list或者array
import numpy as np
cc=[[1,2,3,4,5,6,4,6]] #这里相当于是二维
aa=cc[0] #需要进行如下操作才可以使用set函数
set(aa)
#Out: {1, 2, 3, 4, 5, 6}
或:
aa=np.array(cc[0])
set(aa)
1.2 mat类型及超过一维list、array均不支持
如:
import numpy as np
cc=[[1,2,3,4,5,6,4,6]]
aa=cc 或者 aa=np.array(cc)
set(aa)
则提示错误:
TypeError: unhashable type: 'list' 或者 unhashable type: 'numpy.ndarray'
2.使用set()对整型list排序
set()集合不仅可以删除list中重复的元素,而且还集成了自动升序排序的功能。还是蛮强大的。
但这里有一个坑,当整型list中有负元素时…
在这里插入代码片
a=[3,5,2,8,6,0]
#a=[3,5,2,8,6,0,-2]
b=[7,6,8,3,1]
a.extend(b)
print(list(set(a)))
#输出结果为:
#[0, 1, 2, 3, 5, 6, 7, 8]
但是如果集合中存在负整数:
在这里插入代码片
#a=[3,5,2,8,6,0]
a=[3,5,2,8,6,0,-2]
b=[7,6,8,3,1]
a.extend(b)
print(list(set(a)))
#神奇的一幕出现了
#输出为:[0, 1, 2, 3, 5, 6, 7, 8, -2]
这一点有点坑。
因此保险的方式还是再用一次sort()或sorted()刷一遍吧。
3.两个set的运算
A=[1,2,3]
B=[3,4,5]
3.1 两个列表的交集 (与)
print([i for i in A if i in B])
print( list(set(A).intersection(B)))
print(list(set(A) & set(B)))
#out:
[3]
[3]
[3]
3.2 两个列表的并集(或)
print( list(set(A+B)))
print( list(set(A).union(B)))
print(list(set(A) | set(B)))
#out:
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
3.3 差集:在列表A,而不在列表B
print(list(set(A)-set(B)))
print(list(set(A).difference(set(B))))
#out:
[1, 2]
[1, 2]
3.4 补集:在列表A,不在列表B 或 在列表B,不在列表A (异或)
print(list(set(A)^set(B)))
#out:
[1, 2, 4, 5]
4.见证set的速度
随机生成两个大列表a,b,逐个判断b中元素是否在a中,并返回结果。
import numpy as np
a=np.random.randint(0,10000,10000000).tolist()
b=np.random.randint(0,10000,10000).tolist()
如果用直接用list:
import time
t0=time.time()
res=[]
for item in b:
res.append(item in a)
t1=time.time()
print(t1-t0)
#out:
2.1071205139160156
如果通过set进行查找:
import time
st=set(a)
t0=time.time()
res=[]
for item in b:
res.append(item in st)
t1=time.time()
print(t1-t0)
#out:
0.0030002593994140625
可见,通过set进行元素查找效果很高。
参考文献
[1] https://docs.python.org/zh-cn/3.9/library/stdtypes.html?highlight=set#set