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、Javascript中的闭包比较
Feb 04 Python
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
Apr 25 Python
python基于BeautifulSoup实现抓取网页指定内容的方法
Jul 09 Python
python中如何使用正则表达式的集合字符示例
Oct 09 Python
用Python写王者荣耀刷金币脚本
Dec 21 Python
python实现自动发送邮件
Jun 20 Python
python输入整条数据分割存入数组的方法
Nov 13 Python
Python 正则表达式匹配字符串中的http链接方法
Dec 25 Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
Jan 05 Python
python实现多线程端口扫描
Aug 31 Python
Pytorch 数据加载与数据预处理方式
Dec 31 Python
以SQLite和PySqlite为例来学习Python DB API
Feb 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
异世界新番又来了,同样是从零开始,男主的年龄降到5岁
2020/04/09 日漫
用libTemplate实现静态网页的生成
2006/10/09 PHP
php curl post 时出现的问题解决
2014/01/30 PHP
PHP SPL标准库之数据结构堆(SplHeap)简单使用实例
2015/05/12 PHP
PHP简单实现欧拉函数Euler功能示例
2017/11/06 PHP
jquery创建并行对象或者合并对象的实现代码
2012/10/10 Javascript
Egret引擎开发指南之创建项目
2014/09/03 Javascript
js生成随机数的方法实例
2015/10/16 Javascript
JavaScript 函数的执行过程
2016/05/09 Javascript
Google 地图API资料整理及详细介绍
2016/08/06 Javascript
AngularJS入门教程之AngularJS 模板
2016/08/18 Javascript
详解用node.js实现简单的反向代理
2017/06/26 Javascript
vue-cli整合vuex的时候,修改actions和mutations,实现热部署的方法
2018/09/19 Javascript
基于elementUI实现图片预览组件的示例代码
2019/03/31 Javascript
vue实现按需加载组件及异步组件功能
2019/05/27 Javascript
node.js中 redis 的安装和基本操作示例
2020/02/10 Javascript
跟老齐学Python之编写类之一创建实例
2014/10/11 Python
python判断数字是否是超级素数幂
2018/09/27 Python
解决Python下json.loads()中文字符出错的问题
2018/12/19 Python
利用Python实现kNN算法的代码
2019/08/16 Python
基于TensorFlow常量、序列以及随机值生成实例
2020/01/04 Python
pytorch中使用cuda扩展的实现示例
2020/02/12 Python
Python 远程开关机的方法
2020/11/18 Python
Ubuntu配置Pytorch on Graph (PoG)环境过程图解
2020/11/19 Python
巴黎卡诗加拿大官网:Kérastase加拿大
2018/11/12 全球购物
法国包包和行李箱销售网站:Bagage24.fr
2020/03/24 全球购物
Unix如何添加新的用户
2014/08/20 面试题
儿科主治医生个人求职信
2013/09/23 职场文书
网络工程师个人的自我评价范文
2013/10/01 职场文书
小学教师的个人自我鉴定
2013/10/24 职场文书
教育孩子心得体会
2014/01/01 职场文书
《小小竹排画中游》教学反思
2014/02/26 职场文书
团代会主持词
2014/04/02 职场文书
自我检讨报告
2015/01/28 职场文书
《曹冲称象》教学反思
2016/02/20 职场文书
python自动计算图像数据集的RGB均值
2021/06/18 Python