过滤序列元素

问题

你有一个数据序列,想利用一些规则从中提取出需要的值或者是缩短序列

解法

最简单的过滤序列元素的方法就是使用列表推导。比如:

>>> 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)
...
14
10
23
>>>

有时候,过滤规则比较复杂,不能简单的在列表推导或者生成器表达式中表达出来。比如,假设过滤的时候需要处理一些异常或者其他复杂情况。这时候你可以将过滤代码放到一个函数中,然后使用内建的 filter() 函数。示例如下:

values = ['1', '2', '-3', '-', '4', 'N/A', '5']
def is_int(val):try:x = int(val)return Trueexcept ValueError:return Falseivals = 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', '4801 N BROADWAY', '1039 W GRANVILLE']
>>>

这里的关键点在于先创建一个 Boolean 序列,指示哪些元素复合条件。然后compress() 函数根据这个序列去选择输出对应位置为 True 的元素。

和 filter() 函数类似, compress() 也是返回的一个迭代器。因此,如果你需要得到一个列表,那么你需要使用 list() 来将结果转换为列表类型。

《Python Cookbook 3rd》笔记(1.16):过滤序列元素相关推荐

  1. 《Python Cookbook 3rd》笔记汇总

    文章目录 一.数据结构 二.字符串和文本 三.数字.日期和时间 四.迭代器与生成器 五.文件与IO 一.数据结构 标题 关键词 1.1:拆分序列后赋值给多个变量 可迭代对象.拆分赋值 1.2:拆分任意 ...

  2. 《Python Cookbook 3rd》笔记(1.4):查找最大或最小的N个元素

    <Python Cookbook 3rd>1.4:查找最大或最小的N个元素 问题 怎样从一个集合中获得最大或者最小的N个元素列表? 解法 heapq 模块有两个函数:nlargest()和 ...

  3. Python Cookbook 3rd Edition Documentation

    Python Cookbook 3rd Edition Documentation 文章目录 第一章:数据结构和算法 1.1 解压序列赋值给多个变量 问题 解决方案 讨论 1.2 解压可迭代对象赋值给 ...

  4. 《Python cookbook》笔记一

    <Python cookbook> 第一章 数据结构和算法 - *号解压多个变量 - 如果一个可迭代对象的元素个数超过变量个数时,会抛出一个 ValueError .那么 怎样才能从这个可 ...

  5. 《Python cookbook》笔记二

    <Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...

  6. Machine Learning with Python Cookbook 学习笔记 第6章

    Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...

  7. Machine Learning with Python Cookbook 学习笔记 第8章

    Chapter 8. Handling Images 前言 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放 ...

  8. Machine Learning with Python Cookbook 学习笔记 第9章

    Chapter 9. Dimensionality Reduction Using Feature Extraction 前言 本笔记是针对人工智能典型算法的课程中Machine Learning w ...

  9. Python实战从入门到精通第六讲——数据结构与算法4之过滤序列元素

    一个数据序列,想利用一些规则从中提取出需要的值或者是缩短序列 最简单的过滤序列元素的方法就是使用列表推导: >>> mylist = [1, 4, -5, 10, -7, 2, 3, ...

最新文章

  1. MySql批量插入时,如何不插入重复的数据
  2. 为什么分库分表后不建议跨分片查询
  3. python3语法错误-Python3 错误和异常
  4. 内存经销商穷困潦倒 七元午饭都赊账
  5. StateListDrawable 动态更换背景
  6. python是什么专业学的-Python开发专业学校排名是什么样的
  7. oracle+110个常用函数
  8. Luogu4402 机械排序
  9. python爬虫爬取一次数据多长时间_「Python爬虫系列讲解」1. 网络数据爬取概述
  10. 网易云音乐云盘上传歌词的方法
  11. Jackson的JSON转对象,忽略不需要的字段
  12. Bounds(包围盒)详解-【AABB包围盒、Sphere包围球、OBB方向包围盒、FDH固定方向凸包】
  13. linux换终端的背景颜色,linux 终端背景色修改
  14. python之控制台版本(电影)增删改查
  15. screen 使用命令
  16. RuntimeError: Expected object of type torch.cuda.LongTensor but found type torch.cuda.IntTensor
  17. [Docker]进入容器命令
  18. vs2013 分析 profiler 导致电脑重启
  19. LeetCode 1218 最长定差子序列
  20. JAVA核心知识点--IO流

热门文章

  1. 2018高职计算机474分排名,2018年高职分类考试招生录取分数线出炉
  2. linux编程参数列表,Linux编程 14 文件权限(用户列表passwd,用户控制shadow,useradd模板与useradd命令参数介绍)...
  3. c#sql防注入模糊查询_SQL中利用LIKE实现模糊查询的功能
  4. activexobject对象不能创建_Oracle数据库用户管理之系统权限和对象权限
  5. linux查看启动配置文件内容,Linux开机启动项的查看和设置方法总结
  6. 三层架构与MVC的区别
  7. 一步步编写操作系统21 x86虚拟机bochs 跟踪bios
  8. python settings模块导入不了_python settings 中通过字符串导入模块
  9. springCloud五大组件--Gateway
  10. php跨域session共享,PHP中利用COOKIE与SESSION联合实现SESSION跨域