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的爬虫框架Scrapy来抓取豆瓣电影TOP250
Jan 20 Python
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
Apr 12 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
Mar 30 Python
python代码过长的换行方法
Jul 19 Python
python绘制散点图并标记序号的方法
Dec 11 Python
Python3 批量扫描端口的例子
Jul 25 Python
爬虫代理池Python3WebSpider源代码测试过程解析
Dec 20 Python
python读取图片的几种方式及图像宽和高的存储顺序
Feb 11 Python
python+Selenium自动化测试——输入,点击操作
Mar 06 Python
python 安装库几种方法之cmd,anaconda,pycharm详解
Apr 08 Python
如何在Windows中安装多个python解释器
Jun 16 Python
Python字符串的15个基本操作(小结)
Feb 03 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 万年历实现代码
2012/10/18 PHP
PHP中fwrite与file_put_contents性能测试代码
2013/08/02 PHP
php 使用file_get_contents读取大文件的方法
2014/11/13 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
用js实现的抽象CSS圆角效果!!
2007/05/03 Javascript
JavaScript 变量命名规则
2009/09/23 Javascript
jQuery 点击图片跳转上一张或下一张功能的实现代码
2010/03/12 Javascript
js利用与或运算符优先级实现if else条件判断表达式
2010/04/15 Javascript
jquery+ashx无刷新GridView数据显示插件(实现分页、排序、过滤功能)
2010/04/25 Javascript
JavaScript使用过程中需要注意的地方和一些基本语法
2010/08/26 Javascript
jquery+php随机生成红包金额数量代码分享
2015/08/27 Javascript
Vue.js每天必学之内部响应式原理探究
2016/09/07 Javascript
jquery表单验证实例仿Toast提示效果
2017/03/03 Javascript
vue中$set的使用(结合在实际应用中遇到的坑)
2018/07/10 Javascript
基于axios 解决跨域cookie丢失的问题
2018/09/26 Javascript
three.js实现炫酷的全景3D重力感应
2018/12/30 Javascript
[17:13]DOTA2 HEROS教学视频教你分分钟做大人-斯拉克
2014/06/13 DOTA
python类定义的讲解
2013/11/01 Python
python执行get提交的方法
2015/04/29 Python
Python Property属性的2种用法
2015/06/21 Python
如何利用python查找电脑文件
2018/04/27 Python
详解Django+Uwsgi+Nginx 实现生产环境部署
2018/11/06 Python
python实现ip代理池功能示例
2019/07/05 Python
Python3 tkinter 实现文件读取及保存功能
2019/09/12 Python
django序列化serializers过程解析
2019/12/14 Python
Python Socketserver实现FTP文件上传下载代码实例
2020/03/27 Python
python实现一个猜拳游戏
2020/04/05 Python
Python venv虚拟环境配置过程解析
2020/07/08 Python
如何使用scrapy中的ItemLoader提取数据
2020/09/30 Python
利用html5的websocket实现websocket聊天室
2013/12/12 HTML / CSS
JBL加拿大官方商店:扬声器、耳机等
2020/10/23 全球购物
长青弘远的面试题
2012/06/09 面试题
Java面试笔试题大全
2016/11/23 面试题
专题组织生活会思想汇报
2014/10/01 职场文书
MySQL Router实现MySQL的读写分离的方法
2021/05/27 MySQL
Mysql中的触发器定义及语法介绍
2022/06/25 MySQL