博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python实用技法第15篇:筛选序列中的元素
阅读量:6268 次
发布时间:2019-06-22

本文共 1904 字,大约阅读时间需要 6 分钟。

上一篇文章:
下一篇文章:

1、需求?

序列中含有一些数据,我们需要提取其中的值或根据某些标准对序列做删减,

2、解决方案?

要筛选序列中的数据,通常最简单的方法是使用列表推导式。

例如:

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

结果:

[1, 4, 10, 2, 3][-5, -7, -1]

使用列表推导式的一个潜在缺点是如果原始输入非常大的话,这么做可能会产生一个庞大的结果。如果这是你需要考虑的问题,那么可以使用生成器表达式通过迭代的方法产生筛选结果,例如:

myList=[1,4,-5,10,-7,2,3,-1]pos=(n for n in myList if n >0)for x in pos:    print(x)

结果:

141023

有时候筛选的标准没法简单地表示在列表推导式或生成器表达式中。比如:假设筛选过程涉及异常处理或者其他一些复杂的细节。基于从,可以将处理筛选逻辑的代码放到单独的函数中,然后使用内建的filter()函数处理,示例如下:

values=['1','2','-3','-','4','N/A','5']def is_int(val):    try:        x=int(val)        return True    except ValueError:        return Falseivals=list(filter(is_int,values))print(ivals)

结果:

['1', '2', '-3', '4', '5']

filter()创建了一个迭代器,因此如果我们想要的是列表形式的结果,请确保加上了list(),就像示例中那样。

3、分析

列表推导式和生成器表达式通常是用来筛选数据的最简单和最直接的方式。此外,它们也具有同时对数据做转换的能力。例如:

import mathmyList=[1,4,-5,10,-7,2,3,-1]print([math.sqrt(n) for n in myList if n>0])

结果:

[1.0, 2.0, 3.1622776601683795, 1.4142135623730951, 1.7320508075688772]

关于筛选数据,有一种情况是用新值替换掉不满足标准的值,而不是抛弃它们。例如。除了要找到正整数之外,我们也希望在指定范围内将不满足要求的值替换掉。通常,这可以通过将筛选条件迁移到一个条件表达式中来轻松实现,就像下面这样:

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

结果:

[1, 4, 0, 10, 0, 2, 3, 0][0, 0, -5, 0, -7, 0, 0, -1]

另一个值得一提的筛选工具是itertools.compress(),它接受一个可迭代对象以及一个布尔选择器序列作为输入。输出时,它会给出所有在相应的布尔选择器中为True的可迭代对象元素。如果想把对一个序列的筛选结果施加到另一个相关的序列上时,这就会非常有用。

例如:

from itertools import compressaddress=['5412 N CLARK1','5148 N CLARK2','5800 E CLARK3','2122 N CLARK4','5645 M CLARK5','1060 W CLARK6',]counts=[0,3,10,4,1,7]#构建一个列表,它相应的count值要大于5more5=[n>5 for n in counts]print(more5)print(list(compress(address,more5)))

结果:

[False, False, True, False, False, True]['5800 E CLARK3', '1060 W CLARK6']

这里的关键在于首先创建一个布尔序列,用来表示哪个元素可满足我们的条件,然后compress()函数挑选出满足布尔值为True的相应元素。

同filter()函数一样,正常情况下,compress()会返回一个迭代器。因此,如果需要的话,得使用list()将结果转为列表。

上一篇文章:
下一篇文章:

转载地址:http://xkvpa.baihongyu.com/

你可能感兴趣的文章
做技术做软件-----如何才能拿到上万的月薪
查看>>
linux 查看当前路径命令:pwd
查看>>
At.js – 用于 Web 应用程序的自动完成库
查看>>
[Android Pro] Android权限设置android.permission完整列表
查看>>
如何对抗硬件断点--- 调试寄存器
查看>>
mybatis学习
查看>>
从不同层面看cocos2d-x
查看>>
Struts2技术详解
查看>>
MFC应用程序向导生成的文件
查看>>
Oracle体系结构之oracle密码文件管理
查看>>
【leetcode】Remove Element (easy)
查看>>
mysql多表查询及其 group by 组内排序
查看>>
alsa的snd_pcm_readi()函数和snd_pcm_writei()
查看>>
Android学习网站推荐(转)
查看>>
嵌入式根文件系统的移植和制作详解
查看>>
MEF部件的生命周期(PartCreationPolicy)
查看>>
LCD的接口类型详解
查看>>
nginx 基础文档
查看>>
LintCode: Unique Characters
查看>>
Jackson序列化和反序列化Json数据完整示例
查看>>