Python实用技法第15篇:筛选序列中的元素

作者: IT派森 | 来源:发表于2019-08-06 17:31 被阅读1次

1、需求🙀

序列中含有一些数据,我们需要提取其中的值或根据某些标准对序列做删减,

2、解决方案😸

要筛选序列中的数据,通常最简单的方法是使用列表推导式。

例如:

myList=[1,4,-5,10,-7,2,3,-1]
print([n for n in myList if n>0])
print([n for n in myList if n<0])

结果:

[1, 4, 10, 2, 3]
[-5, -7, -1]
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

使用列表推导式的一个潜在缺点是如果原始输入非常大的话,这么做可能会产生一个庞大的结果。如果这是你需要考虑的问题,那么可以使用生成器表达式通过迭代的方法产生筛选结果,例如:

myList=[1,4,-5,10,-7,2,3,-1]
pos=(n for n in myList if n >0)
for x in pos:
    print(x)

结果:

1
4
10
2
3

有时候筛选的标准没法简单地表示在列表推导式或生成器表达式中。比如:假设筛选过程涉及异常处理或者其他一些复杂的细节。可以将处理筛选逻辑的代码放到单独的函数中,然后使用内建的filter()函数处理,示例如下:

values=['1','2','-3','-','4','N/A','5']
def is_int(val):
    try:
        x=int(val)
        return True
    except ValueError:
        return False

ivals=list(filter(is_int,values))
print(ivals)

结果:

['1', '2', '-3', '4', '5']

filter()创建了一个迭代器,因此如果我们想要的是列表形式的结果,请确保加上了list(),就像示例中那样。

3、分析

列表推导式和生成器表达式通常是用来筛选数据的最简单和最直接的方式。此外,它们也具有同时对数据做转换的能力。例如:

import math
myList=[1,4,-5,10,-7,2,3,-1]
print([math.sqrt(n) for n in myList if n>0])

结果:

[1.0, 2.0, 3.1622776601683795, 1.4142135623730951, 1.7320508075688772]

关于筛选数据,有一种情况是用新值替换掉不满足标准的值,而不是抛弃它们。例如。除了要找到正整数之外,我们也希望在指定范围内将不满足要求的值替换掉。通常,这可以通过将筛选条件迁移到一个条件表达式中来轻松实现,就像下面这样:

myList=[1,4,-5,10,-7,2,3,-1]
print([n if n>0 else 0 for n in myList])
print([n if n<0 else 0 for n in myList])

结果:

[1, 4, 0, 10, 0, 2, 3, 0]
[0, 0, -5, 0, -7, 0, 0, -1]

另一个值得一提的筛选工具是itertools.compress(),它接受一个可迭代对象以及一个布尔选择器序列作为输入。输出时,它会给出所有在相应的布尔选择器中为True的可迭代对象元素。如果想把对一个序列的筛选结果施加到另一个相关的序列上时,这就会非常有用。

例如:

from itertools import compress
address=[
'5412 N CLARK1',
'5148 N CLARK2',
'5800 E CLARK3',
'2122 N CLARK4',
'5645 M CLARK5',
'1060 W CLARK6',
]
counts=[0,3,10,4,1,7]
#构建一个列表,它相应的count值要大于5
more5=[n>5 for n in counts]
print(more5)

print(list(compress(address,more5)))

结果:

[False, False, True, False, False, True]
['5800 E CLARK3', '1060 W CLARK6']
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

这里的关键在于首先创建一个布尔序列,用来表示哪个元素可满足我们的条件,然后compress()函数挑选出满足布尔值为True的相应元素。

同filter()函数一样,正常情况下,compress()会返回一个迭代器。因此,如果需要的话,得使用list()将结果转为列表。

相关文章

  • Python学习路线实用技法:筛选序列中的元素

    Python学习路线实用技法:筛选序列中的元素 序列中含有一些数据,我们需要提取其中的值或根据某些标准对序列做删减...

  • Python实用技法第15篇:筛选序列中的元素

    1、需求? 序列中含有一些数据,我们需要提取其中的值或根据某些标准对序列做删减, 2、解决方案? 要筛选序列中的数...

  • Python 学习笔记:筛选序列中的元素

    问题:序列中有一些数据,需要提出某些值,或者删除某些值 解决方案1:列表推导式(list comprehensio...

  • Python实用技法第17篇:将名称映射到序列的元素中

    1、需求 我们的代码是通过位置(即索引或下标)来访问列表会元组的,但有时候这会让代码变得有些难以阅读。我们希望可以...

  • python 基础 - 列表

    Python 列表 序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第...

  • python - Lists

    2018-05-07 python - Lists Python中最基本的数据结构是序列。序列中的每个元素都被分配...

  • 8、Python 序列

    一、概要 在Python中,最基本的数据结构是序列(sequence)。序列中的每个元素被分配一个序号——即元素的...

  • Python知识

    在Python中,最基本的数据结构是序列(sequence)。序列中的每个元素被分配一个序号——即元素的位置,也称...

  • WIKI | 记一次Python 序列切片操作

    Python 摘:在Python中,序列类型包括字符串、元组、列表。序列就是元素有序排列。通过下标访问,Pytho...

  • 3-序列、列表、元组

    序列 序列就是一堆数据元素的集合,并对每个元素进行编号。在Python中,字符串、列表、元组都属于序列,他们都具有...

网友评论

    本文标题:Python实用技法第15篇:筛选序列中的元素

    本文链接:https://www.haomeiwen.com/subject/etuorctx.html