Python在集合中根据条件筛选数据

首选创建一个集合

1
2
3
4
5
6
import random
import time

l = [random.randint(-10, 10) for i in range(20)]
s = set(l)
print(s)

执行结果为:

1
{2, 3, 4, 5, 7, 8, 10, -1, -9, -6, -5, -4, -2}

现有一个需求, 需要此集合中筛选出可以被3整除的数字都有哪些, 以下给出四种实现方式

第一种方式: 循环迭代

1
2
3
4
5
6
7
print(time.time())
s1 = set()
for item in s:
if item % 3 == 0:
s1.add(item)
print(time.time())
print(s1)

执行结果为:

1
2
3
1500954512.77478
1500954512.774822
{-6, 3, -9}

得到结果需要的时间为: 0.000042

第二种方式: filter 函数

1
2
3
4
5
print('---')
print(time.time())
s2 = list(filter(lambda x: x % 3 == 0, s))
print(time.time())
print(s2)

执行结果为:

1
2
3
1500954512.774839
1500954512.774854
[3, -9, -6]

得到结果需要的时间为: 0.000015

第三种方式: 集合解析式

1
2
3
4
print(time.time())
s3 = {i for i in s if i % 3 == 0}
print(time.time())
print(s3)

执行结果为:

1
2
3
1500954512.774865
1500954512.774885
{-6, 3, -9}

得到结果需要的时间为: 0.000020

第四种方式: 生成器表达式

1
2
3
4
5
print(time.time())
s4 = (i for i in s if i % 3 == 0)
print(time.time())
for i in s4:
print(i)

执行结果为:

1
2
3
4
5
1500954512.774917
1500954512.774934
3
-9
-6

总结:

集合与之前的字典,列表一样, 要实现数据的筛选依然有四种选择, 小数据量下依然推荐使用集合解析式, 大数据量的情况下推荐使用生成器表达式filter 函数(直接返回 filter 迭代对象, 而不直接使用 list 转换)