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使用pil生成缩略图的方法
Mar 26 Python
django上传图片并生成缩略图方法示例
Dec 11 Python
python爬取淘宝商品详情页数据
Feb 23 Python
关于python下cv.waitKey无响应的原因及解决方法
Jan 10 Python
django解决跨域请求的问题详解
Jan 20 Python
Python3.5实现的罗马数字转换成整数功能示例
Feb 25 Python
使用WingPro 7 设置Python路径的方法
Jul 24 Python
Django 重写用户模型的实现
Jul 29 Python
Python读取分割压缩TXT文本文件实例
Feb 14 Python
python对 MySQL 数据库进行增删改查的脚本
Oct 22 Python
python自动从arxiv下载paper的示例代码
Dec 05 Python
python爬虫--selenium模块
Mar 31 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基于回溯算法解决n皇后问题的方法示例
2017/11/07 PHP
jquery $.ajax入门应用一
2008/11/19 Javascript
Javascript 圆角div的实现代码
2009/10/15 Javascript
简单实用的js调试logger组件实现代码
2010/11/20 Javascript
js innerHTML 改变div内容的方法
2013/08/03 Javascript
jquery移动点击的项目到列表最顶端的方法
2015/06/24 Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
2015/11/04 Javascript
jquery制作图片时钟特效
2020/03/30 Javascript
jQuery 中ajax异步调用的四种方式
2016/06/28 Javascript
JavaScript中的对象继承关系
2016/08/01 Javascript
AngularJs上传前预览图片的实例代码
2017/01/20 Javascript
Vue完整项目构建(进阶篇)
2018/02/10 Javascript
在微信小程序中渲染HTML内容的方法示例
2018/09/28 Javascript
JavaScript解析及序列化JSON的方法实例分析
2019/01/04 Javascript
node爬取新型冠状病毒的疫情实时动态
2020/02/06 Javascript
[01:00:54]TI4正赛第二日开场
2014/07/20 DOTA
[43:58]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第二局
2016/02/27 DOTA
Python中实现远程调用(RPC、RMI)简单例子
2014/04/28 Python
进一步了解Python中的XML 工具
2015/04/13 Python
深入解析Python设计模式编程中建造者模式的使用
2016/03/02 Python
python使用正则表达式替换匹配成功的组
2017/11/17 Python
python使用tkinter实现简单计算器
2018/01/30 Python
Python对List中的元素排序的方法
2018/04/01 Python
对Tensorflow中权值和feature map的可视化详解
2018/06/14 Python
python中时间、日期、时间戳的转换的实现方法
2019/07/06 Python
Python简易计算器制作方法代码详解
2019/10/31 Python
python urllib和urllib3知识点总结
2021/02/08 Python
跑步爱好者一站式服务网站:Jack Rabbit
2016/09/01 全球购物
参观监狱心得体会
2014/01/02 职场文书
小学教师评语大全
2014/04/23 职场文书
金融专业毕业生自荐信
2014/06/26 职场文书
2014年工程师工作总结
2014/11/25 职场文书
公务员个人年终总结
2015/02/12 职场文书
2015年医院后勤工作总结
2015/05/20 职场文书
电影雨中的树观后感
2015/06/15 职场文书
redis限流的实际应用
2021/04/24 Redis