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检测QQ在线状态的方法
May 09 Python
python搭建虚拟环境的步骤详解
Sep 27 Python
python实现超市扫码仪计费
May 30 Python
python 检查文件mime类型的方法
Dec 08 Python
从列表或字典创建Pandas的DataFrame对象的方法
Jul 06 Python
处理Selenium3+python3定位鼠标悬停才显示的元素
Jul 31 Python
基于python2.7实现图形密码生成器的实例代码
Nov 05 Python
python读取与处理netcdf数据方式
Feb 14 Python
python实现手势识别的示例(入门)
Apr 15 Python
通过实例简单了解Python sys.argv[]使用方法
Aug 04 Python
Python爬取网站图片并保存的实现示例
Feb 26 Python
基于tensorflow __init__、build 和call的使用小结
Feb 26 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
一个odbc连mssql分页的类
2006/10/09 PHP
php中Socket创建与监听实现方法
2015/01/05 PHP
phpcms的分类名称和类别名称的调用
2017/01/05 PHP
js实现图片轮换效果代码
2013/04/16 Javascript
在Javascript中处理字符串之big()方法的使用
2015/06/08 Javascript
Ajax中解析Json的两种方法对比分析
2015/06/25 Javascript
js识别uc浏览器的代码
2015/11/06 Javascript
HTML5 js实现拖拉上传文件功能
2020/11/20 Javascript
JQuery中Ajax的操作完整例子
2017/03/07 Javascript
jQuery ajax读取本地json文件的实例
2017/10/31 jQuery
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
2018/01/12 Javascript
详解Vue-cli webpack移动端自动化构建rem问题
2018/04/07 Javascript
js实现简单模态框实例
2018/11/16 Javascript
vue2.0中set添加属性后视图不能更新的解决办法
2019/02/22 Javascript
原生js实现的观察者和订阅者模式简单示例
2020/04/18 Javascript
原生js实现购物车
2020/09/23 Javascript
Python计算三维矢量幅度的方法
2015/06/15 Python
Python使用回溯法子集树模板解决迷宫问题示例
2017/09/01 Python
Python实现的自定义多线程多进程类示例
2018/03/23 Python
用TensorFlow实现多类支持向量机的示例代码
2018/04/28 Python
Python mutiprocessing多线程池pool操作示例
2019/01/30 Python
python如何统计代码运行的时长
2019/07/24 Python
使用pyecharts生成Echarts网页的实例
2019/08/12 Python
matplotlib事件处理基础(事件绑定、事件属性)
2021/02/03 Python
JackJones官方旗舰店:杰克琼斯男装
2018/03/27 全球购物
什么是测试驱动开发(TDD)
2012/02/15 面试题
应付会计岗位职责
2013/12/12 职场文书
会计自我鉴定
2014/02/04 职场文书
乡领导班子四风问题对照检查材料
2014/09/25 职场文书
2014年妇幼卫生工作总结
2014/12/09 职场文书
客服专员岗位职责
2015/02/10 职场文书
在校生证明
2015/06/17 职场文书
有关水浒传的读书笔记
2015/06/25 职场文书
廉洁自律心得体会2016
2016/01/13 职场文书
nginx作grpc的反向代理踩坑总结
2021/07/07 Servers
MySQL 1130异常,无法远程登录解决方案详解
2021/08/23 MySQL