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自带PIL库扩展图片大小给图片加文字描述的方法示例
Aug 08 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
Mar 05 Python
Python输入二维数组方法
Apr 13 Python
Python OpenCV实现鼠标画框效果
Aug 19 Python
python多继承(钻石继承)问题和解决方法简单示例
Oct 21 Python
tensorflow实现训练变量checkpoint的保存与读取
Feb 10 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
Feb 26 Python
详解pandas中iloc, loc和ix的区别和联系
Mar 09 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
Apr 10 Python
Python文件操作模拟用户登陆代码实例
Jun 09 Python
Anaconda的安装与虚拟环境建立
Nov 18 Python
Python调用SMTP服务自动发送Email的实现步骤
Feb 07 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
php不用内置函数对数组排序的两个算法代码
2010/02/08 PHP
php中将地址生成迅雷快车旋风链接的代码[测试通过]
2011/04/20 PHP
PHP支付系统设计与典型案例分享
2016/08/02 PHP
thinkphp3.2实现在线留言提交验证码功能
2017/07/19 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
JavaScript 继承详解(二)
2009/07/13 Javascript
使用jQuery简化Ajax开发 Ajax开发入门
2009/10/14 Javascript
jQuery 添加/移除CSS类实现代码
2010/02/11 Javascript
JavaScript和CSS通过expression实现Table居中显示
2013/06/28 Javascript
Seajs的学习笔记
2014/03/04 Javascript
laytpl 精致巧妙的JavaScript模板引擎
2014/08/29 Javascript
JavaScript函数作用域链分析
2015/02/13 Javascript
js中substring和substr两者区别和使用方法
2015/11/09 Javascript
web 前端常用组件之Layer弹出层组件
2016/09/22 Javascript
JS中Select下拉列表类(支持输入模糊查询)功能
2017/01/17 Javascript
关于react-router的几种配置方式详解
2017/07/24 Javascript
js代码实现轮播图
2020/05/04 Javascript
单线程JavaScript实现异步过程详解
2020/05/19 Javascript
vue项目接口域名动态获取操作
2020/08/13 Javascript
JavaScript语法约定和程序调试原理解析
2020/11/03 Javascript
JavaScript实现鼠标经过表格某行时此行变色
2020/11/20 Javascript
在Python的Django框架中包装视图函数
2015/07/20 Python
详解Python做一个名片管理系统
2019/03/14 Python
Linux下远程连接Jupyter+pyspark部署教程
2019/06/21 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
2019/07/07 Python
python 字符串格式化的示例
2020/09/21 Python
HTML5 Canvas绘制五星红旗
2016/05/04 HTML / CSS
俄罗斯在线大型超市:ТутПросто
2021/01/08 全球购物
母亲节演讲稿范文
2014/01/02 职场文书
十八大感想感言
2014/02/10 职场文书
课程改革实施方案
2014/03/16 职场文书
北京导游词
2015/02/12 职场文书
乡镇科协工作总结2015
2015/05/19 职场文书
捐书仪式主持词
2015/07/04 职场文书
2016年万圣节活动总结
2016/04/05 职场文书
面试提问mysql一张表到底能存多少数据
2022/03/13 MySQL