过滤数据是编程中非常频繁的操作,比如过滤掉列表中的非负数,过滤掉a中键值大于0的项字典,过滤掉集合中能被3整除的数等等。Python有一些很方便的写法,这里总结一下。根据条件过滤列表中的数据最常见的方法是使用for循环遍历:data=[-1,2,3,-4,5]#过滤掉非负数res=[]forxindata:ifx>=0:res.append(x)print(res)#Output[2,3,5]这种方法非常冗长且效率低下,但是Python提供了列表理解和过滤功能的方法。先看列表理解:fromrandomimportrandint#生成一个包含10个随机数的列表l=[randint(-10,10)for_inrange(10)]#下划线和i一样,只是一个临时循环variable,使用下划线相当于明确说明这个变量没有其他作用#[5,0,4,5,-1,-1,2,6,-7,-5]#使用列表理解来过滤[xforxinlifx>=0]#[5,0,4,5,2,6]然后看过滤函数:l=[5,0,4,5,-1,-1,2,6,-7,-5]#过滤函数接收两个参数,第一个参数是过滤函数,第二个参数是过滤对象g=filter(lambdax:x>=0,l)#过滤器函数会返回一个生成的Generator对象#Generator对象使用next()获取每一个元素#将generator对象直接传递给list构造函数给list(g)对于简单的过滤功能,推荐使用listcomprehension,这样更简单,速度更快。根据条件过滤字典中的数据首先使用字典分析过滤:#生成一个学生成绩字典,有20个键值对d={'student%d'%i:randint(50,100)foriinrange(1,21)}#过滤得分高于90的items{k:vfork,vind.items()ifv>=90}然后使用filter函数过滤:#获取生成器对象g=filter(lambdaitem:item[1]>=90,d.items())#传给字典构造函数得到过滤后的字典dict(g)根据条件过滤集合中的数据使用集合解析:#生成随机数集合s={randint(0,20)for_inrange(20)}#过滤可被3整除的数字{xforxinsifx%3==0}#{0,6,15,18}原文来自陈十一的博客
