Fork me on GitHub

Python如何根据给定条件筛选列表字典或集合中的数据

数据筛选是Python爬虫完成数据采集后必做的工作,一般来说,成熟的框架(比如:scrapy)会自带一些数据筛选的API,自定义则偏向利用正则表达式来筛选,而今天我们来细化讲解几个直接利用Python实现数据筛选的实际案例。


python_tricks

过滤列表中的负数

需求

过滤掉列表[3, 7, 9, -1, 20, 30, -2, -7, 18, 33, 34, 22, 79, -21, -7]中的负数。

分析解答

这个处理有多种选择,下面我们来注意看看解决方案

Method 1 通用解决方案

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python
# coding:utf-8

data = [3, 7, 9, -1, 20, 30, -2, -7, 18]

resp = []
for i in data:
if i >= 0:
resp.append(i)

print(resp)

实际输出结果:[3, 7, 9, 20, 30, 18]

Method 2 利用filter()

当然,如果能合理使用函数式编程,这些问题处理会更高效。

  • filter()的用法: filter(lambda x: x>=0, data)

当然,不同的代码实现又会影响运行效率,具体我们来看代码差异。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env python
# coding:utf-8

import time

data = [3, 7, 9, -1, 20, 30, -2, -7, 18, 33, 34, 22, 79, -21, -7]

# Method 1 -- 使用filter函数,过滤掉负数
start = time.clock()
r1 = filter(lambda x: x >= 0, data)
end = time.clock()
print("R1 run time: %f" % (end-start))
print(list(r1)) # in python3, filter() return need user list() to display


# Method 2 -- 使用列表解析,过滤掉负数
start = time.clock()
r2 = [x1 for x1 in data if x1 >= 0]
end = time.clock()
print("R2 run time: %f" % (end-start))
print(r2)
print("-"*70)

输出结果:
R1 run time: 0.000003
[3, 7, 9, 20, 30, 18, 33, 34, 22, 79]
R2 run time: 0.000004
[3, 7, 9, 20, 30, 18, 33, 34, 22, 79]

可见使用列表解析式运行效率更好,但因为列表元素数少时差异不明显,甚至使用列表解析更快,30个元素排列时filter()的效率就能直观显示了,所以建议列表中插入多个元素后再来观察差异。

选取高于标准值的字典项

需求

选取出字典{‘Alice’: 77, ‘Bob’: 69, “Mary”: 82, “Tom”: 91, “Lily”: 93}中高于90的条目。

分析解答

这个是典型的按数值进行筛选的场景

1
2
3
4
5
6
7
#!/usr/bin/env python
# coding:utf-8

d = {'Alice': 77, 'Bob': 69, "Mary": 82, "Tom": 91, "Lily": 93}
r = {k: v for k, v in d1.items() if v > 90}

print(r)

输出结果:
{‘Tom’: 91, ‘Lily’: 93}

筛出集合中能被某个数整除的元素

需求

筛出集合[66, 77, 89, 33, 17, 20, 11]中能被3整除的元素

分析解答

1
2
3
4
5
6
7
8
#!/usr/bin/env python
# -*- coding:utf-8 -*-

data = [66, 77, 89, 33, 17, 20, 11]
s = set(data)
result = {x for x in s if x % 3 == 0}
print("过滤后set数据:")
print(result)

输出结果:
过滤后set数据:
{33, 66}
数据源中的数据量很小,其实就算数据量上万处理起来也很迅速。

小结

综上所述,Python3自带常用的数据筛选解决方案如下:


python_parse

虽然是些看似简单的小技巧,但是在复杂度要求不高或者只是需要自己写个小脚本处理测试数据时,还是很灵活高效的,重点还是要活学活用。

更多Python学习相关内容推送,请关注微信公众号。


qrcode_fullstackpentest
-------------  Fin    Thanks for reading!  -------------

本文标题:Python如何根据给定条件筛选列表字典或集合中的数据

文章作者:TesterCC

发布时间:2018年01月02日 - 13:01

最后更新:2019年09月30日 - 11:09

原始链接:http://blog.fullstackpentest.com/Python如何根据给定条件筛选列表字典或集合中的数据.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。