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

Posted Jelly_lyj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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模块介绍-极客学院

以上是关于[PY3]——过滤数据——列表推导filter()itertools.compress()的主要内容,如果未能解决你的问题,请参考以下文章

pythopn 函数(内置函数)

python3 map,filter和列表推导式

最佳列表理解(过滤现有列表)

内置函数续

列表推导式_Python教程

Pyspark 使用 .filter() 过滤掉空列表