[PY3]——过滤数据——列表推导、filter()、itertools.compress()

问题

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

解决方案

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

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

在过滤规则比较复杂不便于用简单的列表推导就写出来的情况下,这时可以考虑写成将规则写成一个函数,然后使用内建的 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 = [‘1‘, ‘2‘, ‘-3‘, ‘-‘, ‘4‘, ‘N/A‘, ‘5‘]
def is_int(val):
    try:
        x=int(val)
        return True
    except ValueError:
        return False
ivals=list(filter(is_int,values))
print(ivals)
     [‘1‘, ‘2‘, ‘-3‘, ‘4‘, ‘5‘]

# 用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模块介绍-极客学院

时间: 2024-10-12 23:57:51

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

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

PHP过滤器包含两种类型 Validation:用来验证验证项是否合法 Sanitization:用来格式化被验证的项目,因此它可能会修改验证项的值,将不合法的字符删除等. input_filters_list() 用来列出当前系统所支持的所有过滤器. 1 2 3 4 5 6 <?php foreach(filter_list() as $id => $filter) {    echo $filter.'    '.filter_id($filter)."\n"; } ?

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

Map函数: 原型:map(function, sequence),作用是将一个列表映射到另一个列表, 使用方法: def f(x): return x**2 l = range(1,10) map(f,l) Out[3]: [1, 4, 9, 16, 25, 36, 49, 64, 81] Reduce函数 原型:reduce(function, sequence, startValue),作用是将一个列表归纳为一个输出,使用方法: def f2(x,y): return x+y reduce

Android利用Filter过滤数据

MainActivity如下: package cc.testfilterable; import java.util.ArrayList; import java.util.HashMap; import android.os.Bundle; import android.widget.ListView; import android.app.Activity; import android.content.Context; /** * Demo描述: * 利用Filter过滤数据 * 可用于

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

Map函数: 原型:map(function, sequence),作用是将一个列表映射到另一个列表, 使用方法: def f(x):     return x**2 l = range(1,10) map(f,l) Out[3]: [1, 4, 9, 16, 25, 36, 49, 64, 81] Reduce函数 原型:reduce(function, sequence, startValue),作用是将一个列表归纳为一个输出, 使用方法: def f2(x,y):     return x

第9条:用生成器表达式来改写数据量较大的列表推导式

核心知识点: (1)当输入的数据量较大时,列表推导可能会因为占用太多内存而出问题. (2)由生成器表达式所返回的迭代器,可以逐次产生输出值,从而避免内存用量问题. (3)把某个生成器表达式所返回的迭代器,放在另一个生成器表达式的for子表达式中,即可将二者结合起来. (4)串在一起的生成器表达式执行速度很快. 列表推导式的缺点是:在推导过程中,对于输入序列中的每个值来说,可能都要创建仅含一项元素的全新列表. 当输入的数据比较少时,不会出任何问题,但如果输入的数据非常多,那么可能会消耗大量内存,并

(列表推导式,生成器表达式,内置函数)

一,列表生成式 示例一: 生成1~100的列表 生成1-100的列表 1 2 3 4 5 li = [] for i in range(1,101):     li.append(i) print(li) 执行输出: [1,2,3...] 生成python1期~11期li = []for i in range(1,12): li.append('python{}期'.format(i))print(li) 执行输出: ['python1期', 'python2期', 'python3期'...]

python的各种推导式(列表推导式、字典推导式、集合推导式)

推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体. 共有三种推导,在Python2和3中都有支持: 列表(list)推导式 字典(dict)推导式 集合(set)推导式 一.列表推导式 1.使用[]生成list 基本格式 variable = [out_exp_res for out_exp in input_list if out_exp == 2] out_exp_res: 列表生成元素表达式,可以是有返

day14,列表推导式,生成器表达式,内置函数

一.列表推导式.生成器表达式: # li = []# for i in range(1,101):# li.append(i)# print(li) #l1 = [python1期,python2期,python3期.....]# l1 = []# for i in range(1,12):# l1.append('python%s期' % i)# print(l1)#一行搞定,列表推导式:用列表推导式能够构建的任何列表,用别的都可以构建.#一行,简单,感觉高端.但是,不易排错.# li = [

python 【迭代器 生成器 列表推导式】

python [迭代器  生成器  列表推导式] 一.迭代器 1.迭代器如何从列表.字典中取值的 index索引 ,key for循环凡是可以使用for循环取值的都是可迭代的可迭代协议 :内部含有__iter__方法的都是可迭代的迭代器协议 :内部含有__iter__方法和__next__方法的都是迭代器 print(dir([1,2,3])) lst_iter = [1,2,3].__iter__() print(lst_iter.__next__()) print(lst_iter.__ne