Python cookbook(数据结构与算法)筛选及提取序列中元素的方法


Posted in Python onMarch 19, 2018

本文实例讲述了Python筛选及提取序列中元素的方法。分享给大家供大家参考,具体如下:

问题:提取出序列中的值或者根据某些标准对序列做删减

解决方案:列表推导式、生成器表达式、使用内建的filter()函数

1、列表推导式方法:存在一个潜在的缺点,如果输入数据非常大可能会产生一个庞大的结果,考虑到该问题,建议选择生成器表达式

# Examples of different ways to filter data
mylist = [1, 4, -5, 10, -7, 2, 3, -1]
print('mylist=',mylist)
# 使用列表推导式
pos = [n for n in mylist if n > 0]
print('正数为:',pos)
neg = [n for n in mylist if n < 0]
print('负数为:',neg)

运行结果:

mylist= [1, 4, -5, 10, -7, 2, 3, -1]
正数为: [1, 4, 10, 2, 3]
负数为: [-5, -7, -1]

2、生成器表达式方法:

mylist = [1, 4, -5, 10, -7, 2, 3, -1]
print('mylist=',mylist)
# 使用生成器表达式
pos = (n for n in mylist if n > 0)
print('生成器为',pos)
for x in pos:
 print(x)

运行结果:

mylist= [1, 4, -5, 10, -7, 2, 3, -1]
生成器为 <generator object <genexpr> at 0x02421FD0>
1
4
10
2
3

3、如果筛选标准无法简单表示在列表推导式或者生成器表达式中,比如筛选过程涉及一些异常处理或者更复杂的细节,可以考虑将处理筛选逻辑的代码放到单独的函数中,然后使用内建的filter()函数处理。

values=['1','2','-3','-','N/A','4','5','%']
def is_int(val): #将处理筛选逻辑的代码放到单独的函数
 try:
  x=int(val)
  return True
 except ValueError:
  return False
ivals=list(filter(is_int,values)) #使用filter(func,list)进行过滤
print(ivals)

运行结果:

['1', '2', '-3', '4', '5']

filter(func,list)会创建一个迭代器,如果想要列表形式的结果,需使用list()将结果转为列表。

补充:

用新值替换掉不满足标准的值,而不是丢弃它们,可通过将筛选条件移到一个条件表达式中来轻松实现。

# Negative values clipped to 0
neg_clip = [n if n > 0 else 0 for n in mylist]
print('负数替换为0,结果:',neg_clip)
# Positive values clipped to 0
pos_clip = [n if n < 0 else 0 for n in mylist]
print('正数替换为0,结果:',pos_clip)
'''

运行结果:

mylist= [1, 4, -5, 10, -7, 2, 3, -1]
负数替换为0,结果: [1, 4, 0, 10, 0, 2, 3, 0]
正数替换为0,结果: [0, 0, -5, 0, -7, 0, 0, -1]

值得推荐的工具itertools.compress(),它接受一个可迭代对象以及一个布尔选择器序列作为输入。

如果想把对一个序列的筛选结果施加到另一个相关的序列上时,就会非常有用。

# 采用筛选工具itertools.compress()
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]
from itertools import compress
more5 = [ n > 5 for n in counts ]
a = list(compress(addresses, more5))
print(a)

运行结果:

['5800 E 58TH', '1060 W ADDISON', '4801 N BROADWAY']

这里的关键是首先创建一个布尔序列,用来表示哪个元素可满足我们的条件。然后compress()函数挑选出满足布尔值为True的相应元素。

filter()函数一样,正常情况下compress()函数返回一个迭代器,若需要返回列表则需使用list()将结果转为列表。

(代码摘自《Python Cookbook》)

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python学习之编写查询ip程序
Feb 27 Python
python调用fortran模块
Apr 08 Python
Django 导出 Excel 代码的实例详解
Aug 11 Python
Python排序搜索基本算法之插入排序实例分析
Dec 11 Python
Python中实例化class的执行顺序示例详解
Oct 14 Python
Django 日志配置按日期滚动的方法
Jan 31 Python
pywinauto自动化操作记事本
Aug 26 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
Jul 01 Python
python如何随机生成高强度密码
Aug 19 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
Sep 30 Python
详解解决jupyter不能使用pytorch的问题
Feb 18 Python
Python OpenCV快速入门教程
Apr 17 Python
django用户注册、登录、注销和用户扩展的示例
Mar 19 #Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
Mar 19 #Python
遗传算法python版
Mar 19 #Python
python实现简单遗传算法
Mar 19 #Python
python psutil库安装教程
Mar 19 #Python
Python递归实现汉诺塔算法示例
Mar 19 #Python
Python实现替换文件中指定内容的方法
Mar 19 #Python
You might like
使用sockets:从新闻组中获取文章(三)
2006/10/09 PHP
php 无法加载mcrypt.dll的解决办法
2013/04/03 PHP
ThinkPHP 404页面的设置方法
2015/01/14 PHP
yum命令安装php7和相关扩展
2016/07/04 PHP
php实现图片以base64显示的方法
2016/10/13 PHP
Yii2实现UploadedFile上传文件示例
2017/02/15 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
php使用Swoole实现毫秒级定时任务的方法
2020/09/04 PHP
推荐20家国外的脚本下载网站
2011/04/28 Javascript
JavaScript两种跨域技术全面介绍
2014/04/16 Javascript
JavaScript设计模式之工厂模式和构造器模式
2015/02/11 Javascript
AngularJs  Understanding Angular Templates
2016/09/02 Javascript
Easyui Tree获取当前选择节点的所有顶级父节点
2017/02/14 Javascript
jQuery的三种bind/One/Live/On事件绑定使用方法
2017/02/23 Javascript
Vue2.0实现1.0的搜索过滤器功能实例代码
2017/03/20 Javascript
vue中使用element-ui进行表单验证的实例代码
2018/06/22 Javascript
如何制作一个Node命令行图像识别工具
2018/12/12 Javascript
vant中的toast轻提示实现代码
2020/11/04 Javascript
Python基于回溯法子集树模板实现8皇后问题
2017/09/01 Python
详解用Python练习画个美队盾牌
2019/03/23 Python
Win10 安装PyCharm2019.1.1(图文教程)
2019/09/29 Python
python实现矩阵和array数组之间的转换
2019/11/29 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
浅谈Python xlwings 读取Excel文件的正确姿势
2021/02/26 Python
CSS3中各种颜色属性的使用教程
2016/05/17 HTML / CSS
Vision Directa智利眼镜网:框架眼镜、隐形眼镜和名牌太阳眼镜
2016/11/23 全球购物
北京鼎普科技股份有限公司软件测试面试题
2012/04/07 面试题
EJB2和EJB3在架构上的不同点
2014/09/29 面试题
创先争优活动党员公开承诺书
2014/08/29 职场文书
2014年防汛工作总结
2014/12/08 职场文书
2015年转正工作总结范文
2015/04/02 职场文书
校园文化艺术节开幕词
2016/03/04 职场文书
《岳阳楼记》原文、译文赏析
2019/09/10 职场文书
2019年手机市场的调研报告2篇
2019/10/10 职场文书
Nginx中使用Lua脚本与图片的缩略图处理的实现
2022/03/18 Servers
安装harbor作为docker镜像仓库的问题
2022/06/14 Servers