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 31 Python
为什么选择python编程语言入门黑客攻防 给你几个理由!
Feb 02 Python
Java编程迭代地删除文件夹及其下的所有文件实例
Feb 10 Python
Python3.6简单反射操作示例
Jun 14 Python
设置python3为默认python的方法
Oct 31 Python
python存储16bit和32bit图像的实例
Dec 05 Python
使用python获取(宜宾市地震信息)地震信息
Jun 20 Python
Python ORM编程基础示例
Feb 02 Python
python zip,lambda,map函数代码实例
Apr 04 Python
python中selenium库的基本使用详解
Jul 31 Python
用 python 进行微信好友信息分析
Nov 28 Python
python 递归相关知识总结
Mar 03 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 curl常见错误:SSL错误、bool(false)
2011/12/28 PHP
php中删除、清空session的方式总结
2015/10/09 PHP
PHP实现打包下载文件的方法示例
2017/10/07 PHP
ASP.NET jQuery 实例5 (显示CheckBoxList成员选中的内容)
2012/01/13 Javascript
基于jQuery的遍历同id元素 并响应事件的代码
2012/06/14 Javascript
图片无缝滚动代码(向左/向下/向上)
2013/04/10 Javascript
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
2014/10/17 Javascript
javascript修改图片src的方法
2015/01/27 Javascript
js实现兼容IE、Firefox的图片缩放代码
2015/12/08 Javascript
利用jsonp跨域调用百度js实现搜索框智能提示
2016/08/24 Javascript
在node中如何使用 ES6
2017/04/22 Javascript
JS判断微信扫码的方法
2017/08/07 Javascript
原生js 封装get ,post, delete 请求的实例
2017/08/11 Javascript
使用vue制作FullPage页面滚动效果
2017/08/21 Javascript
AngularJS的$location使用方法详解
2017/10/19 Javascript
vue的全局变量和全局拦截请求器的示例代码
2018/09/13 Javascript
layui添加动态菜单与选项卡 AJAX请求的例子
2019/09/25 Javascript
JQuery发送ajax请求时中文乱码问题解决
2019/11/14 jQuery
vue学习笔记之作用域插槽实例分析
2020/02/01 Javascript
Python实现Tab自动补全和历史命令管理的方法
2015/03/12 Python
在Linux上安装Python的Flask框架和创建第一个app实例的教程
2015/03/30 Python
使用python实现rsa算法代码
2016/02/17 Python
浅谈Python中chr、unichr、ord字符函数之间的对比
2016/06/16 Python
Python分析彩票记录并预测中奖号码过程详解
2019/07/09 Python
python爬虫之爬取百度音乐的实现方法
2019/08/24 Python
TensorFlow索引与切片的实现方法
2019/11/20 Python
利用Python实现Excel的文件间的数据匹配功能
2020/06/16 Python
Melissa鞋英国官方网站:Nonnon
2019/05/01 全球购物
英国经济型酒店品牌:Travelodge
2019/12/17 全球购物
保护动物的标语
2014/06/11 职场文书
公司介绍信范文
2015/01/31 职场文书
经典励志格言:每日一句,让你每天充满能量
2019/08/16 职场文书
python中Tkinter 窗口之输入框和文本框的实现
2021/04/12 Python
SQLServer中JSON文档型数据的查询问题解决
2021/06/27 SQL Server
JVM的类加载器和双亲委派模式你了解吗
2022/03/13 Java/Android
python数字图像处理:图像简单滤波
2022/06/28 Python