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实现的批量下载RFC文档
Mar 10 Python
Perl中著名的Schwartzian转换问题解决实现
Jun 02 Python
Python fileinput模块使用实例
Jun 03 Python
TensorFlow深度学习之卷积神经网络CNN
Mar 09 Python
python实现京东秒杀功能
Jul 30 Python
在python中利用KNN实现对iris进行分类的方法
Dec 11 Python
python用requests实现http请求代码实例
Oct 31 Python
如何将 awk 脚本移植到 Python
Dec 09 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
Feb 28 Python
Python字典取键、值对的方法步骤
Sep 30 Python
Python实战之实现简易的学生选课系统
May 25 Python
OpenCV-Python实现图像平滑处理操作
Jun 08 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 冒泡排序算法的实现代码
2010/08/08 PHP
MySQL的FIND_IN_SET函数使用方法分享
2012/03/27 PHP
浅谈PHP强制类型转换,慎用!
2013/06/06 PHP
PHP判断是否连接上网络的方法
2015/07/01 PHP
php实现网站顶踩功能的完整前端代码
2015/07/19 PHP
php中请求url的五种方法总结
2017/07/13 PHP
php+mysql开发的最简单在线题库(在线做题系统)完整案例
2019/03/30 PHP
javascript 异常处理使用总结
2009/06/21 Javascript
jQuery右键菜单contextMenu使用实例
2011/09/28 Javascript
javasciprt下jquery函数$.post执行无响应的解决方法
2014/03/13 Javascript
面向切面编程(AOP)的理解
2015/05/01 Javascript
jQuery实现网页抖动的菜单抖动效果
2015/08/07 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
2016/05/30 Javascript
Javascript删除指定元素节点的方法
2016/06/21 Javascript
jQuery学习笔记之回调函数
2016/08/15 Javascript
微信小程序进行微信支付的步骤昂述
2016/12/01 Javascript
微信小程序实现的canvas合成图片功能示例
2019/05/03 Javascript
微信小程序复选框实现多选一功能过程解析
2020/02/14 Javascript
为react组件库添加typescript类型提示的方法
2020/06/15 Javascript
Vue ElementUI实现:限制输入框只能输入正整数的问题
2020/07/31 Javascript
详解webpack的文件监听实现(热更新)
2020/09/11 Javascript
vue制作toast组件npm包示例代码
2020/10/29 Javascript
[01:02:02]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第二局
2016/02/25 DOTA
[01:12:53]完美世界DOTA2联赛PWL S2 Forest vs SZ 第一场 11.25
2020/11/26 DOTA
[原创]pip和pygal的安装实例教程
2017/12/07 Python
英国最大的邮寄种子和植物公司:Thompson & Morgan
2017/09/21 全球购物
Expedia挪威官网:酒店、机票和租车
2018/03/03 全球购物
JD Sports比利时官网:英国领先的运动鞋和运动服饰零售商
2018/10/10 全球购物
新闻专业个人自我评价
2013/09/21 职场文书
《莫高窟》教学反思
2014/02/25 职场文书
城市轨道交通工程职业生涯规划书范文
2014/09/16 职场文书
2014年班组工作总结
2014/11/20 职场文书
精神文明建设先进个人事迹材料
2014/12/24 职场文书
三严三实·严以修身心得体会
2016/01/15 职场文书
青年人初次创业的“五不要”
2019/08/23 职场文书
超越Nginx的Web服务器caddy优雅用法
2022/06/21 Servers