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之Python安装
Sep 12 Python
Django框架中的对象列表视图使用示例
Jul 21 Python
利用PyInstaller将python程序.py转为.exe的方法详解
May 03 Python
使用python生成目录树
Mar 29 Python
Python实现的爬取网易动态评论操作示例
Jun 06 Python
使用python将时间转换为指定的格式方法
Nov 12 Python
Pytorch反向求导更新网络参数的方法
Aug 17 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
Feb 25 Python
使用IPython或Spyder将省略号表示的内容完整输出
Apr 20 Python
浅谈Python中的生成器和迭代器
Jun 19 Python
windows+vscode安装paddleOCR运行环境的步骤
Nov 11 Python
Python 数据可视化神器Pyecharts绘制图像练习
Feb 28 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中的类-什么叫类
2006/11/20 PHP
Windows下安装Memcached的步骤说明
2010/04/25 PHP
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
2011/03/19 PHP
如何用phpmyadmin设置mysql数据库用户的权限
2012/01/09 PHP
PHP 伪静态技术原理以及突破原理实现介绍
2013/07/12 PHP
php获取表单中多个同名input元素的值
2014/03/20 PHP
WordPress中用于检索模版的相关PHP函数使用解析
2015/12/15 PHP
phalcon框架使用指南
2016/02/23 PHP
php socket通信简单实现
2016/11/18 PHP
php简单处理XML数据的方法示例
2017/05/19 PHP
JS自动缩小超出大小的图片
2012/10/12 Javascript
javascript数组操作(创建、元素删除、数组的拷贝)
2014/04/07 Javascript
JQuery标签页效果的两个实例讲解(4)
2015/09/17 Javascript
jQuery实现Email邮箱地址自动补全功能代码
2015/11/03 Javascript
BootStrap智能表单实战系列(三)分块表单配置详解
2016/06/13 Javascript
使用jquery.qrcode.js生成二维码插件
2016/10/17 Javascript
bootstrap模态框消失问题的解决方法
2016/12/02 Javascript
Node.JS使用Sequelize操作MySQL的示例代码
2017/10/09 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
Vue移动端实现图片上传及超过1M压缩上传
2019/12/23 Javascript
原生js实现的金山打字小游戏(实例代码详解)
2020/03/16 Javascript
javascript使用正则表达式实现注册登入校验
2020/09/23 Javascript
Python贪吃蛇游戏编写代码
2020/10/26 Python
Python正则表达式匹配数字和小数的方法
2019/07/03 Python
django inspectdb 操作已有数据库数据的使用步骤
2021/02/07 Python
使用placeholder属性设置input文本框的提示信息
2020/02/19 HTML / CSS
美国当红的名品折扣网:Gilt Groupe
2016/08/15 全球购物
网络艺术零售业的先驱者:artrepublic
2017/09/26 全球购物
ghd法国官方网站:英国最受欢迎的美发工具品牌
2019/04/18 全球购物
斯洛伐克最大的婴儿食品和用品网上商店:Feedo.sk
2020/12/21 全球购物
值类型与引用类型有什么不同?请举例说明?并分别列举几种相应的数据类型
2015/10/24 面试题
电子商务专业毕业生工作推荐信
2013/11/17 职场文书
秘书英文求职信
2014/04/16 职场文书
我的画教学反思
2014/04/28 职场文书
2014年化验室工作总结
2014/11/21 职场文书
SQL实现LeetCode(177.第N高薪水)
2021/08/04 MySQL