如何在列表,字典,集合中根据条件刷选数据
说明:
本文分析的类型:
- 列表
- 字典
- 集合
结合每种类型筛选数据的方法的不同,区分出方法间的差异。
一、列表案例
需求:过滤掉列表中的负数。
li = [1,5,-3,-1,0,9,-10,10]
1、通用方法:迭代列表获取列表中的每个元素进行选择
代码:
li = [1, 5, -3, -1, 0, 9, -10, 10] ret = [] for i in li: if i >= 0: ret.append(i) print(ret)
2、filter函数
语法:filter(lambda x: x >= 0, data)
li = [1, 5, -3, -1, 0, 9, -10, 10] new_li = [] ret = filter(lambda x: x >= 0, li) print(ret) for i in ret: new_li.append(i) print(new_li)
结果:
<filter object at 0x0178A4B0> [1, 5, 0, 9, 10]
说明:
filter直接返回的结果是一个课迭代对象。要想获取其中的数据要对filter结果进行遍历。
上面的代码也可以简写:
li = [1, 5, -3, -1, 0, 9, -10, 10] new_li = [] ret = [x for x in filter(lambda x: x >= 0, li)] print(ret)
3、列表解析
说明:
列表解析,直接在”[ ]”中操作,将判断条件写在了列表解析中。
问题:既然都能得出结果,那filter和列表解析那个好那?
我们可以通过测试两段代码执行的时间。
import timeit li = [1, 5, -3, -1, 0, 9, -10, 10] t1 = timeit.Timer('[x for x in filter(lambda x: x >= 0, %s)]' % li) t2 = timeit.Timer('[x for x in %s if x >= 0]' % li) print(t1.timeit()) print(t2.timeit())
结果:
1.9449847999118903 0.865514452222458
说明:
1、结果可以明显看出,列表解析所用的时间是filter的时间的一半左右,即,列表解析最快,所以推荐使用列表解析。
2、这2中方式都是远快于使用 for 这种迭代方式的。
二、字典案例
需求:筛选出value值高于90的项。
dic = {‘haha’:79, ‘heihei’:88, ‘hehe’:95, ‘xxx’:100}
1、普通方法
dic = {'haha': 79, 'heihei': 88, 'hehe': 95, 'xxx': 100} new_dic = {} for k,v in dic.items(): if v >= 90: new_dic[k] = v print(new_dic)
结果:
{'hehe': 95, 'xxx': 100}
2、字典解析
dic = {'haha': 79, 'heihei': 88, 'hehe': 95, 'xxx': 100} ret = {k: v for k, v in dic.items() if v >= 90} print(ret)
说明:
字典解析运行时间远快于普通方法。
三、集合案例
需求:筛选出集合中能被3整除的元素。
s = {77,88,99,6,15,20}
1、普通方法
s = {77, 88, 99, 6, 15, 20} new_s = set() for i in s: if i % 3 == 0: new_s.add(i) print(new_s)
结果:
{99, 6, 15}
2、集合解析
s = {77, 88, 99, 6, 15, 20} ret = {x for x in s if x % 3 == 0} print(ret)
说明:
集合解析也是远快于普通for循环的。