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中使用摄像头实现简单的延时摄影技术
Mar 27 Python
在Python的struct模块中进行数据格式转换的方法
Jun 17 Python
Python中list列表的一些进阶使用方法介绍
Aug 15 Python
Python实现的多线程http压力测试代码
Feb 08 Python
python 换位密码算法的实例详解
Jul 19 Python
Python实现正弦信号的时域波形和频谱图示例【基于matplotlib】
May 04 Python
Python网络爬虫之爬取微博热搜
Apr 18 Python
对Django 转发和重定向的实例详解
Aug 06 Python
python 实现矩阵填充0的例子
Nov 29 Python
python操作链表的示例代码
Sep 27 Python
Pytest之测试命名规则的使用
Apr 16 Python
Django开发RESTful API实现增删改查(入门级)
May 10 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 ajax 分页类代码
2008/11/13 PHP
php session劫持和防范的方法
2013/11/12 PHP
Yii框架用户登录session丢失问题解决方法
2017/01/07 PHP
[原创]PHPCMS遭遇会员投稿审核无效的解决方法
2017/01/11 PHP
PHP实现防止表单重复提交功能【基于token验证】
2018/05/24 PHP
参考:关于Javascript中实现暂停的几篇文章
2007/03/04 Javascript
javascript options属性集合操作代码
2009/12/28 Javascript
商城常用滚动的焦点图效果代码简单实用
2013/03/28 Javascript
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
2014/06/06 Javascript
JavaScript使用slice函数获取数组部分元素的方法
2015/04/06 Javascript
使用Browserify配合jQuery进行编程的超级指南
2015/07/28 Javascript
第十章之巨幕页头缩略图与警告框组件
2016/04/25 Javascript
jQuery+Ajax实现用户名重名实时检测
2017/06/01 jQuery
js构造函数创建对象是否加new问题
2018/01/22 Javascript
垃圾回收器的相关知识点总结
2018/05/13 Javascript
jquery使用FormData实现异步上传文件
2018/10/25 jQuery
使用VueRouter的addRoutes方法实现动态添加用户的权限路由
2019/06/03 Javascript
ES6 Symbol在对象中的作用实例分析
2020/06/06 Javascript
vue 计算属性和侦听器的使用小结
2021/01/25 Vue.js
three.js 实现露珠滴落动画效果的示例代码
2021/03/01 Javascript
Python编程入门的一些基本知识
2015/05/13 Python
使用Python进行二进制文件读写的简单方法(推荐)
2016/09/12 Python
Python基于scapy实现修改IP发送请求的方法示例
2017/07/08 Python
轻松理解Python 中的 descriptor
2017/09/15 Python
Python实现的归并排序算法示例
2017/11/21 Python
python集合常见运算案例解析
2019/10/17 Python
在pycharm中debug 实时查看数据操作(交互式)
2020/06/09 Python
HTML5 FormData 方法介绍以及实现文件上传示例
2017/09/12 HTML / CSS
HTML5 创建canvas元素示例代码
2014/06/04 HTML / CSS
荷兰睡眠专家:Beter Bed
2020/11/23 全球购物
党校学习自我鉴定
2014/02/24 职场文书
平安工地汇报材料
2014/08/19 职场文书
助残日活动总结
2014/08/27 职场文书
小学生九一八纪念日83周年演讲稿500字
2014/09/17 职场文书
导游词之镇江焦山
2019/11/21 职场文书
Jpa Specification如何实现and和or同时使用查询
2021/11/23 Java/Android