问题

你有一个数据序列,想利用一些规则从中提取出需要的值或者是缩短序列

解决方案

最简单的过滤数据的方法,就是使用列表推导。

使用列表推导的一个潜在缺陷就是如果输入非常大的时候会产生一个非常大的结果集,对内存敏感时可以考虑使用生成器表达式迭代产生过滤元素

在过滤规则比较复杂不便于用简单的列表推导就写出来的情况下,这时可以考虑写成将规则写成一个函数,然后使用内建的 filter() 函数

还有过滤工具 itertools.compress()

列表推导

lst=[1,4,-5,10,-7,2,3,-1]
print([n for n in lst if n>0])
[1, 4, 10, 2, 3] #若考虑内存占用情况,则:
result=[n for n in lst if n>0]
for x in result:
print(x)
1
4
10
2
3

filter(函数,序列)

filter()接收一个函数和一个序列。

filter()会把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

values = ['', '', '-3', '-', '', 'N/A', '']
def is_int(val):
try:
x=int(val)
return True
except ValueError:
return False
ivals=list(filter(is_int,values))
print(ivals)
['', '', '-3', '', ''] # 用filter()删除1~100的素数

itertools.compress(data,selectors)

compress 可用于对数据进行筛选,当 selectors 的某个元素为 true 时,则保留 data 对应位置的元素,否则去除

from itertools import compress
print(list(compress("ABCDEF",[1,0,1,0,1,1])))
['A', 'C', 'E', 'F']
print(list(compress("ABCDEF",[True,False,True,False,True,True])))
['A', 'C', 'E', 'F'] addresses = [
'5412 N CLARK',
'5148 N CLARK',
'5800 E 58TH',
'2122 N CLARK',
'5645 N RAVENSWOOD',
'1060 W ADDISON',
'4801 N BROADWAY',
'1039 W GRANVILLE',
]
counts = [0, 3, 10, 4, 1, 7, 6, 1]
print(list(compress(addresses,[n>5 for n in counts])))
['5800 E 58TH', '1060 W ADDISON', '4801 N BROADWAY']

过滤数据时转换数据

import math
print([math.sqrt(n) for n in lst if n>0])
[1.0, 2.0, 3.1622776601683795, 1.4142135623730951, 1.7320508075688772]

过滤数据时替换数据

print([n if n>0 else 0 for n in lst])
[1, 4, 0, 10, 0, 2, 3, 0]
print([n if n<0 else '-' for n in lst])
['-', '-', -5, '-', -7, '-', '-', -1]

参考文章

filter-廖雪峰的网站

itertools模块介绍-极客学院

[PY3]——过滤数据——列表推导、filter()、itertools.compress()的更多相关文章

  1. python列表推导同filter和map的比较

    首先介绍下filter和map: filter: filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表. 该接收两个参数,第一个为函数,第二个为序列,序列的每个元 ...

  2. 列表推导式、生成器表达式以及zip()max()max()/min()sum()sort()map()filter()的用法

    列表推导式: 基本格式: variable = [out_exp_res for out_exp in input_list if out_exp == 2] #out_exp_res: 列表生成元素 ...

  3. 第7条:用列表推导式来取代map和filter

    核心知识点: 1.列表推导式要比内置的map和filter函数清晰,因为它无需额外编写lambda表达式. 2.列表推导式可以跳过输入列表中的某些元素,如果改用map来做,那就必须辅以filter方能 ...

  4. 2-2 列表推导同 filter 和 map 的比较

    列表推导同 filter 和 map 的比较 参考廖雪峰的文档: filter()函数:用于过滤序列. filter()接收一个函数和一个序列.把传入的函数依次作用于传入的序列的每个元素,根据返回值是 ...

  5. 转:Python一些特殊用法(map、reduce、filter、lambda、列表推导式等)

    Map函数: 原型:map(function, sequence),作用是将一个列表映射到另一个列表, 使用方法: def f(x): return x**2 l = range(1,10) map( ...

  6. 用php自带的filter函数验证、过滤数据 -转载

    PHP过滤器包含两种类型 Validation:用来验证验证项是否合法 Sanitization:用来格式化被验证的项目,因此它可能会修改验证项的值,将不合法的字符删除等. input_filters ...

  7. Python 数据排序和列表迭代和列表推导应用

    1.In-place sorting 原地排序 data=[6,4,5,2,3,1] print ('before sort', data) data.sort() print ('after sor ...

  8. Android利用Filter过滤数据

    MainActivity如下: package cc.testfilterable; import java.util.ArrayList; import java.util.HashMap; imp ...

  9. Python里的map、reduce、filter、lambda、列表推导式

    Map函数: 原型:map(function, sequence),作用是将一个列表映射到另一个列表, 使用方法: def f(x): return x**2 l = range(1,10) map( ...

随机推荐

  1. docker查看挂载目录命令

    docker inspect -f "{{.Mounts}}"  692691b7416 692691b7416为containerId

  2. SQL datediff()函数 时间差

    定义和用法 DATEDIFF() 函数返回两个日期之间的天数. 语法 DATEDIFF(datepart,startdate,enddate) startdate 和 enddate 参数是合法的日期 ...

  3. .net core 使用 redis

    .net core 使用 redis 个人感觉.net core 对于微软技术而言有很重要的意义 ,所以最近已有时间就想看一看关于.net core 的文章. 今天我就来写一写如何在.net core ...

  4. js自执行函数、调用递归函数、圆括号运算符、函数声明的提升

    前言 起因是我要在jquery的ajax中需要根据返回值来决定是否继续发起ajax请求,这是一个有条件的循环,符合条件就跳出.可以使用while循环的,但是想了想还是递归调用好用. 调用递归函数 递归 ...

  5. SpringMvc+ajax 实现json格式数据传递

    传JSON对象 前端 function test () { var param = {username : "yitop"}; $.ajax({ timeout : 20000, ...

  6. 负载均衡群集LB

    负载均衡群集是目前企业用得最多的群集类型,通过主节点负载调度器(Director),使用特定的分流算法,将来自客户机的访问请求分担给多个服务器节点共同处理,从而缓解整个系统的负载压力,响应更多请求:群 ...

  7. Java中类变量和实例变量的初始化

    1. 类变量和实例变量 类变量即类成员变量中的静态变量,它们可以通过类名来直接访问. 实例变量是类成员变量中的非静态变量,只有在实例化对象之后通过对象来访问. 2. 空间分配的时间不同 类变量是在类加 ...

  8. 定期删除Azure存储账号下N天之前的数据文件-ASM

    ######RemoveStorageBlob*DaysOld##### <# .SYNOPSIS Remove all blob contents from one storage accou ...

  9. iOS --UIScrollView的学习(三)自动轮播

    1.前面两章讲的都是基本的用法,这次讲一下比较重要的功能分页和自动播放 2.UIPageControl--分页 2.1只要将UIScrollView的pageEnabled属性设置为YES,UIScr ...

  10. 能够放在文档的 <head> 中的各种配置元素

    一份关于任何可以写入到你的文档中 <head> 部分的清单 最小推荐 <meta charset="utf-8"> <meta http-equiv= ...