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 17 Python
Python 数据处理库 pandas 入门教程基本操作
Apr 19 Python
用Python下载一个网页保存为本地的HTML文件实例
May 21 Python
python 爬虫 批量获取代理ip的实例代码
May 22 Python
python用列表生成式写嵌套循环的方法
Nov 08 Python
python石头剪刀布小游戏(三局两胜制)
Jan 20 Python
Pycharm简单使用教程(入门小结)
Jul 04 Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
Mar 10 Python
Keras设定GPU使用内存大小方式(Tensorflow backend)
May 22 Python
python操作链表的示例代码
Sep 27 Python
Python离线安装openpyxl模块的步骤
Mar 30 Python
Python利用FlashText算法实现替换字符串
Mar 31 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源码之 ext/mysql扩展部分
2009/07/17 PHP
rrmdir php中递归删除目录及目录下的文件
2011/05/15 PHP
PHP文件锁函数flock()详细介绍
2014/11/18 PHP
Ext.MessageBox工具类简介
2009/12/10 Javascript
JavaScript arguments 多参传值函数
2010/10/24 Javascript
更优雅的事件触发兼容
2011/10/24 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
javascript四舍五入函数代码分享(保留后几位)
2013/12/10 Javascript
点击标签切换和自动切换DIV选项卡
2014/08/10 Javascript
JS小游戏之极速快跑源码详解
2014/09/25 Javascript
排序算法的javascript实现与讲解(99js手记)
2014/09/28 Javascript
jQuery中eq()方法用法实例
2015/01/05 Javascript
NodeJS使用jQuery选择器操作DOM
2015/02/13 NodeJs
JavaScript的React框架中的JSX语法学习入门教程
2016/03/05 Javascript
Dojo获取下拉框的文本和值实例代码
2016/05/27 Javascript
轮播的简单实现方法
2016/07/28 Javascript
详解如何使用Vue2做服务端渲染
2017/03/29 Javascript
利用node.js制作命令行工具方法教程(一)
2017/06/22 Javascript
详解开源的JavaScript插件化框架MinimaJS
2017/10/26 Javascript
js的各种数据类型判断的介绍
2019/01/19 Javascript
解决vue单页面 回退页面 keeplive 缓存问题
2020/07/22 Javascript
[02:50]2014DOTA2 TI预选赛预选赛 大神专访第一弹!
2014/05/21 DOTA
Python中字典的setdefault()方法教程
2017/02/07 Python
python实现简单淘宝秒杀功能
2018/05/03 Python
对python多线程与global变量详解
2018/11/09 Python
Python配置虚拟环境图文步骤
2019/05/20 Python
树莓派与PC端在局域网内运用python实现即时通讯
2019/06/22 Python
Python爬取豆瓣视频信息代码实例
2019/11/16 Python
pandas参数设置的实用小技巧
2020/08/23 Python
欧洲品牌瓷器餐具网上商店:Porzellantreff.de
2018/04/04 全球购物
捐书寄语赠言
2014/01/18 职场文书
雪山饭庄的创业计划书范文
2014/01/18 职场文书
《窗前的气球》教学反思
2014/04/07 职场文书
2015年预备党员自我评价
2015/03/04 职场文书
初二物理教学反思
2016/02/19 职场文书
JavaScript中isPrototypeOf函数
2021/11/07 Javascript