python_cookbook笔记
1.16 过滤元素内容
问题描述:
你有一个数据序列,想利用一些规则从中提取出需要的值或者是缩短序列。
比如:提取列表中元素是整数的部分,并输出出来。
问题分析:
1.首先可以单纯使用列表生成式判断,但是得使用isinstance方法判断是否为整数。
isinstance(variable,type)
下面展示一些 内联代码片
。
print([i for i in val if isinstance(i,int)])
但是此时有个问题即,当列表中元素为str类型的元素,此时的isinstance由于i为str就一直返回false,那么整个程序输出即为空列表[]。并且使用列表推导的一个潜在缺陷就是如果输入非常大的时候会产生一个非常大的结果集,占用大量内存。如果你对内存比较敏感,那么你可以使用生成器表达式迭代产生过滤的元素。
问题解决
此时可以使用内建函数filter()构建生成器:
def in_filter(val):
try:
x=int(val)
return True
except ValueError:
return False
使用迭代器filter将依次判断val元素中的值是否符合判断函数in_filter(),函数返回值为Ture则输出i的值,否则不输出,然后依次读完val。
完整程序
val = ['1','2','-3','-','n/a','5']
def in_filter(val):
try:
x=int(val)
return True
except ValueError:
return False
print([i for i in val if isinstance(i,int)])
a = list(filter(in_filter,val))
print(a)
对于两个列表处理中,一个作为iterable对象,一个作为boolean对象,可以使用itertools.compress()函数进行过滤选择。
如:选择B列表中大于5的对应A列表的位置元素
B = [ '5412 N CLARK','5148 N CLARK', '5800 E 58TH', '2122 N CLARK', '5645 N RAVENSWOOD', '1060 W ADDISON', '4801 N BROADWAY', '1039 W GRANVILLE', ]
A = [ 0, 3, 10, 4, 1, 7, 6, 1]
可以这么编写:
from itertools import compress
# 首先生成boolean类型的列表
m = [n>5 for n in A]
# 再compress选择对应A中的元素
list(compress(A,m))