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遍历zip文件输出名称时出现乱码问题的解决方法
Apr 08 Python
在Python中使用全局日志时需要注意的问题
May 06 Python
python删除特定文件的方法
Jul 30 Python
Python中常用操作字符串的函数与方法总结
Feb 04 Python
Python网络编程详解
Oct 31 Python
超简单使用Python换脸实例
Mar 27 Python
python3.6使用tkinter实现弹跳小球游戏
May 09 Python
python制作英语翻译小工具代码实例
Sep 09 Python
Python错误的处理方法
Jun 23 Python
TensorFlow Autodiff自动微分详解
Jul 06 Python
整理Python中常用的conda命令操作
Jun 15 Python
Anaconda配置各版本Pytorch的实现
Aug 07 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
从零开始 教你如何搭建Discuz!4.1论坛
2006/07/07 PHP
PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
2011/06/09 PHP
thinkPHP显示不出验证码的原因与解决方法分析
2017/05/20 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
2019/04/15 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
2020/02/29 PHP
jquery判断checkbox(复选框)是否被选中的代码
2010/10/20 Javascript
jQuery实现的一个自定义Placeholder属性插件
2014/08/11 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
JavaScript中利用各种循环进行遍历的方式总结
2015/11/10 Javascript
利用JS实现文字的聚合动画效果
2017/01/22 Javascript
websocket+node.js实现实时聊天系统问题咨询
2017/05/17 Javascript
vue mintui-Loadmore结合实现下拉刷新和上拉加载示例
2017/10/12 Javascript
使用vue的transition完成滑动过渡的示例代码
2018/06/25 Javascript
浅谈ECMAScript 中的Array类型
2019/06/10 Javascript
详解Vue.js和layui日期控件冲突问题解决办法
2019/07/25 Javascript
Vue 同步异步存值取值实现案例
2020/08/05 Javascript
通过滑动翻页效果实现和移动端click事件问题
2021/01/26 Javascript
Python学习笔记整理3之输入输出、python eval函数
2015/12/14 Python
Django小白教程之Django用户注册与登录
2016/04/22 Python
Python 判断是否为质数或素数的实例
2017/10/30 Python
Python实现将json文件中向量写入Excel的方法
2018/03/26 Python
Python遍历文件夹 处理json文件的方法
2019/01/22 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
2020/04/08 Python
全球最大的中文旅行网站:去哪儿网
2017/11/16 全球购物
亚洲颇具影响力的男性在线购物零售商:His
2019/11/24 全球购物
铭万公司.net面试题笔试题
2014/07/20 面试题
EJB3推出JPA的原因
2013/10/16 面试题
应届生高等护理求职信
2013/10/12 职场文书
党课学习思想汇报
2014/01/02 职场文书
雷锋式好少年事迹材料
2014/08/17 职场文书
学校法制宣传日活动总结
2014/11/01 职场文书
《西游记》读后感(3篇)
2019/09/20 职场文书
python Tkinter的简单入门教程
2021/04/11 Python
「Manga Time Kirara MAX」2022年5月号封面公开
2022/03/21 日漫
Python闭包的定义和使用方法
2022/04/11 Python
苹果发布了MagSafe固件更新,可以不外接电源实现最高7.5W充电
2022/04/21 数码科技