python_cookbook(1)

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))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值