Python在列表中根据条件筛选数据

首先我们创建一个列表

1
2
3
4
5
import random
import time

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

执行结果为:

1
[-1, 0, 8, 3, 5, 0, 4, 0, -2, 5]

现有一个需求, 需要在这个列表中筛选出大于0的数字, 以下给出四种实现方式

第一种方法: 循环迭代

1
2
3
4
5
6
7
l2 = []
print(time.time())
for item in l:
if item > 0:
l2.append(item)
print(time.time())
print(l2)

执行结果为:

1
2
3
1500915233.146998
1500915233.147016
[8, 3, 5, 4, 5]

得到结果需要的时间为0.000018

第二种方法: filter函数

1
2
3
4
print(time.time())
l3 = list(filter(lambda x: x>0, l))
print(time.time())
print(l3)

执行结果为:

1
2
3
1500915233.147029
1500915233.147039
[8, 3, 5, 4, 5]

得到结果需要的时间为0.000010

第三种方法: 列表解析式

1
2
3
4
print(time.time())
l4 = [item for item in l if item > 0]
print(time.time())
print(l4)

执行结果为:

1
2
3
1500915233.14705
1500915233.147056
[8, 3, 5, 4, 5]

得到结果需要的时间为0.000006

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

如果列表数据量巨大, 应该考虑的不是使用列表解析器, 而是生成器表达式

1
2
3
4
print(time.time())
l5 = (item for item in l if item > 0)
print(time.time())
print(type(l5))

执行结果为:

1
2
3
1500916299.74144
1500916299.741445
<class 'generator'>

得到结果需要的时间为0.000005

总结:

通过以上的四种实践方式得出, 使用循环迭代的方式性能最低, 小数据量时, 使用列表解析式是最好的选择; 如果数据量巨大, 应该使用生成器表达式生成一个可迭代对象提供使用

备注:

  • 列表解析 [expr for iter_var in iterable if cond_expr]

  • 生成器表达式 (expr for iter_var in iterable if cond_expr)

两者的语法非常相似, 但生成器表达式返回的不是一个列表类型对象, 而是一个生成器对象, 生成器是一个内存使用友好的结构