首页 > 代码库 > python三大类型数据筛选

python三大类型数据筛选

如何在列表,字典,集合中根据条件刷选数据

说明:

本文分析的类型:

  • 列表
  • 字典
  • 集合

结合每种类型筛选数据的方法的不同,区分出方法间的差异。

一、列表案例

需求:过滤掉列表中的负数。

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

结果:

<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、列表解析

技术分享
li = [1, 5, -3, -1, 0, 9, -10, 10]ret = [x for x in li if x >= 0]print(ret)
列表解析

说明:

列表解析,直接在”[ ]”中操作,将判断条件写在了列表解析中。

问题:既然都能得出结果,那filter和列表解析那个好那?

我们可以通过测试两段代码执行的时间。

技术分享
import timeitli = [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.94498479991189030.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] = vprint(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循环的。

python三大类型数据筛选