美文网首页
Python 过滤序列元素

Python 过滤序列元素

作者: 大梦三千秋 | 来源:发表于2020-05-21 20:42 被阅读0次

过滤序列元素

问题

有个原数据序列,想利用一些规则缩短序列或者提取需要的值?

解决办法

使用列表推导式是最简单的过滤序列元素的方法。比如:

>>> mylist = [1, 3, 4, -2, -10, -8, 5, -7]
>>> [n for n in mylist if n > 0]
[1, 3, 4, 5]
>>> [n for n in mylist if n < 0]
[-2, -10, -8, -7]

但是,使用列表推导式最明显的问题是,输入非常大的时候产生的结果集往往会非常大,从而占用大量的内存。如果需求对内存敏感,可以考虑使用生成器表达式迭代产生过滤的元素。示例如下:

>>> results = (n for n in mylist if n > 0)
>>> results
<generator object <genexpr> at 0x000000000294BA98>
>>> for x in results:
...     print(x)
...
1
3
4
5

以上的方法主要是针对规则比较简单的例子。如果过滤规则比较复杂,例如,需要处理一些异常或者其他复杂的情况。这个时候建议将过滤的规则写入函数中,然后用内建函数 filter()。示例如下:

values = ['1', '-3', '2', '-', '6', 'N/A', '5']


def is_int(value):
    '''
    检验传入的参数是否是数值

    Args:
        value: 传入的待检验的值

    Returns:
        返回布尔值,检验传入的值是否符合规则

    Raises:
        ValueError: 访问 int() 发生的错误
    '''
    try:
        _ = int(value)
        return True
    except ValueError:
        return False


int_values = list(filter(is_int, values))
print(int_values)
# ['1', '-3', '2', '6', '5']

filter() 函数创建迭代器,这里需要得到列表,所以使用了 list() 进行转换。

代码分析

列表推导式和生成器表达式是最简单的过滤数据的方式。而且两者在过滤的同时能够转换数据。实例如下:

>>> mylist = [1, 3, 4, -2, -10, -8, 5, -7]
>>> import math
>>> [math.sqrt(n) for n in mylist if n > 0]
[1.0, 1.7320508075688772, 2.0, 2.23606797749979]

这里延伸讲下另一种过滤操作,就是将不符合规则的值用新的值替代,而不是直接剔除。例如,在数据中找正数,而其他非正数替代成指定的数值。示例如下:

>>> change_neg = [x if x > 0 else 0 for x in mylist]
>>> change_neg
[1, 3, 4, 0, 0, 0, 5, 0]

还有一个值得关注的过滤工具 itertools.compress(),它以一个 iterable 对象和一个相对应的 Boolean 选择器序列作为输入参数。然后输出 iterable 对象中对应选择器为 True 的元素。当需要用另外一个相关的序列来过滤某个序列的时候,这个函数就能派上用场。比如,下面的示例:

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]

需求是讲 count 值大于 5 的地输出,代码可以这样写:

>>> from itertools import compress
>>> more5 = [n > 5 for n in counts]
>>> more5
[False, False, True, False, False, True, True, False]
>>> list(compress(addresses,more5))
['5800 E 58TH', '1060 W ADDISON', '4801 N BROADWAY']

这里主要的关键点在于要先创建 Boolean 序列,指定哪些元素符合条件。然后用 compress() 函数根据这个序列去输出对应位置为 True 的元素。

filter() 函数类似,compress() 返回的结果也是迭代器。因此如果需要列表,也可用 list() 将结果进行转换,如上示例。

以上为本篇的主要内容。

相关文章

  • Python 过滤序列元素

    过滤序列元素 问题 有个原数据序列,想利用一些规则缩短序列或者提取需要的值? 解决办法 使用列表推导式是最简单的过...

  • Python内置的filter()函数和Pandas中的Data

    1.Python filter() 函数 filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代...

  • 2 计数,元素过滤

    1、计数 collections.Counter 类用来计算序列中的某元素的数目。 2、过滤元素 最简单的过滤序列...

  • 过滤序列元素

    问题:你有一个数据序列,想利用一些规则从中提取出需要的值或者是缩短序列。 你可以选择列表推导。但是如果过滤规则很复...

  • 过滤序列元素

    问题 你有一个数据序列,想利用一些规则从中提取出需要的值或者是缩短序列 解决方案 最简单的过滤序列元素的方法就是使...

  • 利用filter()和lambda表达式求100内3的倍数

    filter()过滤器 描述 filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的...

  • filter和map和reduce使用

    filter: 描述 filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。...

  • map,filter,max,min四个key的内置函数的简单理

    一、filter filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。接收...

  • Python3 - 过滤序列元素(推导式)

    问题 一个数据序列,想利用一些规则从中提取出需要的值或者是缩短序列。 解决问题 最简单的过滤序列元素的方法就是使用...

  • filter

    filter: Python内建的filter()函数用于过滤序列。 filter()和map()类似 filte...

网友评论

      本文标题:Python 过滤序列元素

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