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 self,cls,decorator的理解
Jul 13 Python
Web服务器框架 Tornado简介
Jul 16 Python
在Django中创建第一个静态视图
Jul 15 Python
selenium python浏览器多窗口处理代码示例
Jan 15 Python
高效使用Python字典的清单
Apr 04 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
Feb 07 Python
python傅里叶变换FFT绘制频谱图
Jul 19 Python
pip 安装库比较慢的解决方法(国内镜像)
Oct 06 Python
记录模型训练时loss值的变化情况
Jun 16 Python
python中线程和进程有何区别
Jun 17 Python
基于Python爬取51cto博客页面信息过程解析
Aug 25 Python
python xlwt模块的使用解析
Apr 13 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学习 运算符与运算符优先级
2008/06/15 PHP
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
2011/12/06 PHP
PHP中的Memcache详解
2014/04/05 PHP
php中fgetcsv()函数用法实例
2014/11/28 PHP
Zend Framework教程之Resource Autoloading用法实例
2016/03/08 PHP
php简单创建zip压缩文件的方法
2016/04/30 PHP
javascript调试过程中找不到哪里出错的可能原因
2013/12/16 Javascript
通过隐藏iframe实现文件下载的js方法介绍
2014/02/26 Javascript
Javascript连接多个数组不用concat来解决
2014/03/24 Javascript
JavaScript实现三阶幻方算法谜题解答
2014/12/29 Javascript
Express系列之multer上传的使用
2017/10/27 Javascript
微信小程序使用progress组件实现显示进度功能【附源码下载】
2017/12/12 Javascript
在小程序Canvas中使用measureText的方法示例
2018/10/19 Javascript
vue实现点击隐藏与显示实例分享
2019/02/13 Javascript
vue 解决addRoutes多次添加路由重复的操作
2020/08/04 Javascript
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
Pandas中把dataframe转成array的方法
2018/04/13 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
2018/11/06 Python
python将txt等文件中的数据读为numpy数组的方法
2018/12/22 Python
flask应用部署到服务器的方法
2019/07/12 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
2020/02/28 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
2020/03/13 Python
使用keras实现非线性回归(两种加激活函数的方式)
2020/07/05 Python
CSS3中的元素过渡属性transition示例详解
2016/11/30 HTML / CSS
CSS3属性background-size使用指南
2014/12/09 HTML / CSS
Grid 宫格常用布局的实现
2020/01/10 HTML / CSS
编写html5时调试发现脚本php等网页js、css等失效
2013/12/31 HTML / CSS
中东地区最大的奢侈品市场:The Luxury Closet
2019/04/09 全球购物
使用索引有什么好处
2016/07/27 面试题
妇产科护士自我鉴定
2013/10/15 职场文书
电子商务个人职业生涯规划范文
2014/02/12 职场文书
员工入职担保书范文
2014/04/01 职场文书
高中生第一学年自我鉴定
2014/09/12 职场文书
综治目标管理责任书
2015/05/11 职场文书
2016年中学清明节活动总结
2016/04/01 职场文书
演讲稿之开卷有益
2019/08/07 职场文书