• 技术文章 >后端开发 >Python教程

    Python如何筛选序列中的元素

    不言不言2018-10-22 17:20:48转载1308
    本篇文章给大家带来的内容是关于Python如何筛选序列中的元素 ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

    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]

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

    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']

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

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

    以上就是Python如何筛选序列中的元素的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:segmentfault思否,如有侵犯,请联系admin@php.cn删除
    专题推荐:python
    上一篇:Python如何利用itertools.groupby() 根据字段将记录分组 下一篇:Python实现从字典中提取子集的方法(代码)
    20期PHP线上班

    相关文章推荐

    精选22门好课,价值3725元,开通VIP免费学习!• Python解析参数的三种方法详解• Python数据类型简介之numpy• python虚拟环境配置与管理• 总结分享Python冷门的技巧• 聊聊Python中列表和字典前加星号(**)
    1/1

    PHP中文网