Python过滤序列元素的方法


Posted in Python onJuly 31, 2020

问题

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

解决方案

最简单的过滤序列元素的方法就是使用列表推导。比如:

>>> mylist = [1, 4, -5, 10, -7, 2, 3, -1]
>>> [n for n in mylist if n > 0]
[1, 4, 10, 2, 3]
>>> [n for n in mylist if n < 0]
[-5, -7, -1]
>>>

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

>>> pos = (n for n in mylist if n > 0)
>>> pos
<generator object <genexpr> at 0x1006a0eb0>
>>> for x in pos:
... print(x)
...
1
4
10
2
3
>>>

有时候,过滤规则比较复杂,不能简单的在列表推导或者生成器表达式中表达出来。 比如,假设过滤的时候需要处理一些异常或者其他复杂情况。这时候你可以将过滤代码放到一个函数中, 然后使用内建的 filter() 函数。示例如下:

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)
# Outputs ['1', '2', '-3', '4', '5']

filter() 函数创建了一个迭代器,因此如果你想得到一个列表的话,就得像示例那样使用 list() 去转换。

讨论

列表推导和生成器表达式通常情况下是过滤数据最简单的方式。 其实它们还能在过滤的时候转换数据。比如:

>>> mylist = [1, 4, -5, 10, -7, 2, 3, -1]
>>> import math
>>> [math.sqrt(n) for n in mylist if n > 0]
[1.0, 2.0, 3.1622776601683795, 1.4142135623730951, 1.7320508075688772]
>>>

过滤操作的一个变种就是将不符合条件的值用新的值代替,而不是丢弃它们。 比如,在一列数据中你可能不仅想找到正数,而且还想将不是正数的数替换成指定的数。 通过将过滤条件放到条件表达式中去,可以很容易的解决这个问题,就像这样:

>>> clip_neg = [n if n > 0 else 0 for n in mylist]
>>> clip_neg
[1, 4, 0, 10, 0, 2, 3, 0]
>>> clip_pos = [n if n < 0 else 0 for n in mylist]
>>> clip_pos
[0, 0, -5, 0, -7, 0, 0, -1]
>>>

另外一个值得关注的过滤工具就是 itertools.compress() , 它以一个 iterable 对象和一个相对应的 Boolean 选择器序列作为输入参数。 然后输出 iterable 对象中对应选择器为 True 的元素。 当你需要用另外一个相关联的序列来过滤某个序列的时候,这个函数是非常有用的。 比如,假如现在你有下面两列数据:

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]

现在你想将那些对应 count 值大于5的地址全部输出,那么你可以这样做:

>>> from itertools import compress
>>> more5 = [n > 5 for n in counts]
>>> more5
[False, False, True, False, False, True, True, False]
>>> list(compress(addresses, more5))
['5800 E 58TH', '1060 W ADDISON', '4801 N BROADWAY']
>>>

这里的关键点在于先创建一个 Boolean 序列,指示哪些元素符合条件。 然后 compress() 函数根据这个序列去选择输出对应位置为 True 的元素。

filter() 函数类似, compress() 也是返回的一个迭代器。因此,如果你需要得到一个列表, 那么你需要使用 list() 来将结果转换为列表类型。

以上就是Python过滤序列元素的方法的详细内容,更多关于Python过滤序列元素的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python生成随机数的方法
Jan 14 Python
TensorFlow实现RNN循环神经网络
Feb 28 Python
使用python画个小猪佩奇的示例代码
Jun 06 Python
Python 多线程不加锁分块读取文件的方法
Dec 11 Python
Python线性拟合实现函数与用法示例
Dec 13 Python
代码详解django中数据库设置
Jan 28 Python
Python使用正则实现计算字符串算式
Dec 29 Python
python文件和文件夹复制函数
Feb 07 Python
Python任务自动化工具tox使用教程
Mar 17 Python
基于python爬取链家二手房信息代码示例
Oct 21 Python
Python 虚拟环境工作原理解析
Dec 24 Python
C3 线性化算法与 MRO之Python中的多继承
Oct 05 Python
python中的django是做什么的
Jul 31 #Python
如何基于python把文字图片写入word文档
Jul 31 #Python
django教程如何自学
Jul 31 #Python
Python实现一个优先级队列的方法
Jul 31 #Python
django表单中的按钮获取数据的实例分析
Jul 31 #Python
pycharm中使用request和Pytest进行接口测试的方法
Jul 31 #Python
django创建css文件夹的具体方法
Jul 31 #Python
You might like
PHP的分页功能
2007/03/21 PHP
php ss7.5的数据调用 (笔记)
2010/03/08 PHP
php判断电脑访问、手机访问的例子
2014/05/10 PHP
PHP图形操作之Jpgraph学习笔记
2015/12/25 PHP
thinkphp3.2中实现phpexcel导出带生成图片示例
2017/02/14 PHP
解决PHPstudy Apache无法启动的问题【亲测有效】
2020/10/30 PHP
javascript语句中的CDATA标签的意义
2007/05/09 Javascript
jQuery中将函数赋值给变量的调用方法
2012/03/23 Javascript
js 将json字符串转换为json对象的方法解析
2013/11/13 Javascript
json的定义、标准格式及json字符串检验
2014/05/11 Javascript
js操作IE浏览器弹出浏览文件夹可以返回目录路径
2014/07/14 Javascript
nodejs简单实现中英文翻译
2015/05/04 NodeJs
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
详解Webwork中Action 调用的方法
2016/02/02 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
2016/09/29 Javascript
webpack入门必知必会
2017/01/16 Javascript
jQuery实现验证码功能
2017/03/17 Javascript
深入理解Node中的buffer模块
2017/06/03 Javascript
javascript数组定义的几种方法
2017/10/06 Javascript
D3.js实现简洁实用的动态仪表盘的示例
2018/04/04 Javascript
纯JS实现的读取excel文件内容功能示例【支持所有浏览器】
2018/06/23 Javascript
解决vue中虚拟dom,无法实时更新的问题
2018/09/15 Javascript
ExtJs使用自定义插件动态保存表头配置(隐藏或显示)
2018/09/25 Javascript
nodejs 使用nodejs-websocket模块实现点对点实时通讯
2018/11/28 NodeJs
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
node-red File读取好保存实例讲解
2019/09/11 Javascript
json_decode 索引为数字时自动排序问题解决方法
2020/03/28 Javascript
Python上下文管理器全实例详解
2019/11/12 Python
3种适用于Python的疯狂秘密武器及原因解析
2020/04/29 Python
python实现批量转换图片为黑白
2020/06/16 Python
印度尼西亚在线时尚购物网站:ZALORA印尼
2016/08/02 全球购物
eDreams澳大利亚:预订机票、酒店和度假产品
2017/04/19 全球购物
教师见习总结范文
2015/06/23 职场文书
2015年社区国庆节活动总结
2015/07/30 职场文书
用 Python 元类的特性实现 ORM 框架
2021/05/19 Python
Nginx开源可视化配置工具NginxConfig使用教程
2022/06/21 Servers