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语言实现将图片转化为html页面
Dec 06 Python
selenium+python设置爬虫代理IP的方法
Nov 29 Python
Python 分享10个PyCharm技巧
Jul 13 Python
阿里云ECS服务器部署django的方法
Aug 29 Python
Python使用Pandas库常见操作详解
Jan 16 Python
python对指定字符串逆序的6种方法(小结)
Apr 02 Python
深入了解Python 变量作用域
Jul 24 Python
多个版本的python共存时使用pip的正确做法
Oct 26 Python
Python用dilb提取照片上人脸的示例
Oct 26 Python
Jupyter Notebook 安装配置与使用详解
Jan 06 Python
python绘制高斯曲线
Feb 19 Python
Pytorch中Softmax与LogSigmoid的对比分析
Jun 05 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
全国FM电台频率大全 - 9 上海市
2020/03/11 无线电
短波收音机简介
2021/03/01 无线电
珊瑚虫IP库浅析
2007/02/15 PHP
php自定义加密与解密程序实例
2014/12/31 PHP
php实现网站文件批量压缩下载功能
2015/10/28 PHP
PHP Cookei记录用户历史浏览信息的代码
2016/02/03 PHP
Web版彷 Visual Studio 2003 颜色选择器
2007/01/09 Javascript
FileUpload上传图片(图片不变形)
2010/08/05 Javascript
Javascript跨域请求的4种解决方式
2013/03/17 Javascript
利用javascript打开模态对话框(示例代码)
2014/01/11 Javascript
JavaScript中操作字符串小结
2015/05/04 Javascript
js去除浏览器默认底图的方法
2015/06/08 Javascript
学习javascript面向对象 理解javascript原型和原型链
2016/01/04 Javascript
Bootstrap 源代码分析(未完待续)
2016/08/17 Javascript
JS实现点击表头表格自动排序(含数字、字符串、日期)
2017/01/22 Javascript
jQuery、zepto、js常用小技巧
2017/02/12 Javascript
Bootstrap Table使用整理(三)
2017/06/09 Javascript
最通俗易懂的javascript变量提升详解
2017/08/05 Javascript
详解js几个绕不开的事件兼容写法
2017/08/30 Javascript
微信小程序自定义导航栏(模板化)
2019/11/15 Javascript
关于JavaScript数组去重的一些理解汇总
2020/09/10 Javascript
Python处理RSS、ATOM模块FEEDPARSER介绍
2015/02/18 Python
Python中如何优雅的合并两个字典(dict)方法示例
2017/08/09 Python
在PyCharm的 Terminal(终端)切换Python版本的方法
2019/08/02 Python
pytorch方法测试详解——归一化(BatchNorm2d)
2020/01/15 Python
jupyter lab文件导出/下载方式
2020/04/22 Python
什么是Python中的顺序表
2020/06/02 Python
html如何对span设置宽度
2019/10/30 HTML / CSS
adidas爱尔兰官方网站:阿迪达斯运动鞋和运动服
2019/11/01 全球购物
英国经济型酒店品牌:Travelodge
2019/12/17 全球购物
工厂实习感言
2014/01/14 职场文书
外语系毕业生求职自荐信
2014/04/12 职场文书
英语课外活动总结
2014/08/27 职场文书
村党建工作汇报材料
2014/11/02 职场文书
小兵张嘎观后感300字
2015/06/03 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书