前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >python-进阶教程-对列表中的元素进行筛选

python-进阶教程-对列表中的元素进行筛选

作者头像
kirin
发布于 2021-03-11 06:24:10
发布于 2021-03-11 06:24:10
3.5K0
举报
文章被收录于专栏:Kirin博客Kirin博客

本文主要介绍根据给定条件对列表中的元素进行筛序,剔除异常数据,并介绍列表推导式和生成表达式两种方法。。

1.列表推导式(list comprehension)

mylist = [1, 2, 3, -4, -5, 6, 7, 8, 9] positive_list = [n for n in mylist if n > 0 ] print(positive_list) #result:[1, 2, 3, 6, 7, 8, 9] 优点:简单。列表推导式的实现非常简单,在数据量不大的情况下很实用。

缺点:占用内存大。由于列表推导式采用for循环一次性处理所有数据,当原始输入非常大的情况下,需要占用大量的内存空间。

2.生成器表达式

mylist = [1, 2, 3, -4, -5, 6, 7, 8, 9] pos = (n for n in mylist if n > 0 ) print(pos) for x in pos: print(x) 其中的pos是我们构建的一个生成器,通过print()函数可以证实:<generator object <genexpr> at 0x000000DD6A9D0200>

相比于列表推导式,生成器表达式每次只处理一个数据,而不是处理整个数据结构,因此更加节约内存。

结论:处理少量数据用列表推导式,处理大量数据用生成器表达式

3.更复杂的筛选条件

有的时候筛选的标准并非如此简单,甚至涉及到异常处理等细节,这个时候可以先将复杂的筛选条件写入函数,该函数返回bool值,然后利用Python内建filter()函数进行处理。

values = [‘1′,’-123′, ‘N/A’, ‘-‘, ‘+369’, ‘hello’]

def is_int(val): try: x = int(val) return True except ValueError: return False

ivals = list(filter(is_int, values)) print(ivals) #result:[‘1’, ‘-123’, ‘+369’] 利用int()转换函数和异常处理函数实现的对int型数据的判断;

filter()函数创建了一个迭代器,前面的list是将该迭代器转换为list数据。

4.实用操作

在使用列表推导式和生成器表达式筛选数据的过程,还可以附带着进行数据的处理工作。

mylist = [1, 4, -5, 10, -7, 2, 3, -1]

neg_clip = [n**2 if n > 0 else 0 for n in mylist] print(neg_clip) #result:[1, 16, 0, 100, 0, 4, 9, 0]

import math pos_clip = [n if n < 0 else math.sqrt(n) for n in mylist] print(pos_clip) #result:[1.0, 2.0, -5, 3.1622776601683795, -7, 1.4142135623730951, 1.7320508075688772, -1] 另外,介绍一个筛选工具: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 ] print(more5) #result:[False, False, True, False, False, True, True, False] a = list(compress(addresses, more5)) print(a) #result:[‘5800 E 58TH’, ‘1060 W ADDISON’, ‘4801 N BROADWAY’] 这里的more5将大于5的值替换为True,其余替换为False。

itertools.compress(data, selectors):该函数会根据selectors中元素的bool值筛选data对应位置的元素,并返回一个迭代器。因此,需要对返回值取list才能查看结果。

相比于filter()函数,itertools.compress()形式更简单,不需要构建额外的函数。 ———————————————— 版权声明:本文为CSDN博主「shangyj17」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_17753903/article/details/85395502

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/03/07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文