Python 的内置函数 filter

Python 内建函数列表 > Python 的内置函数 eval

Python 的内建函数 filter() 是一个非常有用的高阶函数,它用于对可迭代对象进行筛选过滤。它的基本工作原理是根据指定的函数条件,从输入的可迭代对象中筛选出符合条件的元素,返回一个迭代器对象。

def filter(fn, iterable):
    '''
    过滤数据

    :param fn: 回调函数,返回 True 是元素保留,返回 False 时元素去除
    :param iterable: 要过滤的可迭代对象
    :return: 过滤后的可迭代对象
    '''

详细说明

filter() 函数的语法格式为:

filter(function, iterable)

其中:

  • function 是筛选条件函数,当该参数为 None 时,filter() 会自动过滤掉可迭代对象中值为 False 的元素
  • iterable 是待处理的可迭代对象,如列表、元组等

工作原理

filter() 会遍历 iterable 中的每个元素,并调用 function 函数进行测试:

  1. 对于每个元素 x,计算 function(x)
  2. 如果返回值为 True,则保留该元素
  3. 如果返回值为 False,则过滤掉该元素

最终返回一个包含所有保留元素的迭代器对象。如果需要列表形式的结果,可以使用 list() 进行转换。

示例应用

示例1:过滤奇数

numbers = [1, 2, 3, 4, 5, 6]
even_numbers = filter(lambda x: x % 2 == 0, numbers)
print(list(even_numbers))  # 输出:[2, 4, 6]

示例2:过滤空字符串

strings = ["hello", "", "world", "", "python"]
non_empty = filter(None, strings)
print(list(non_empty))  # 输出:['hello', 'world', 'python']

示例3:使用自定义函数过滤

def is_positive(num):
    return num > 0

numbers = [-5, -3, 0, 2, 4]
positives = filter(is_positive, numbers)
print(list(positives))  # 输出:[2, 4]

注意事项

  1. filter() 返回的是迭代器而不是列表,如果需要列表必须显式转换
  2. 与列表推导式相比,filter() 在可读性上有时不如列表推导式清晰
  3. 当过滤条件简单时,使用 filter() 结合 lambda 会更简洁
  4. 在 Python 3 中,filter() 返回的是过滤器对象,而在 Python 2 中返回的是列表

性能考虑

filter() 的执行效率与列表推导式相当,但对于大型数据集,filter() 可能更节省内存,因为它返回的是迭代器而不是完整的列表。在处理大数据集时,如果需要节省内存,filter() 是更好的选择。

filter() 函数常与其他函数式编程工具如 map()reduce() 配合使用,可以构建出简洁高效的数据处理管道。这种组合方式遵循"数据转换流水线"的设计模式,每个函数专注于完成一个特定的数据处理任务:

  1. filter() 负责数据筛选

    • 示例:从列表中筛选出偶数
    numbers = [1, 2, 3, 4, 5, 6]
    even_numbers = filter(lambda x: x % 2 == 0, numbers)
    
  2. map() 负责数据转换

    • 接上例,将筛选出的偶数平方
    squared_evens = map(lambda x: x**2, even_numbers)
    
  3. reduce() 负责数据聚合

    • 最后计算平方后的偶数和
    from functools import reduce
    sum_squared = reduce(lambda x, y: x + y, squared_evens)
    

典型应用场景包括:

  • 数据清洗流程:先过滤无效数据,再转换格式,最后汇总统计
  • 日志分析:筛选特定级别的日志,提取关键信息,计算指标
  • 电商数据处理:过滤已下架商品,转换价格格式,计算总销售额

这种组合的优势在于:

  1. 代码可读性强,每个步骤意图明确
  2. 内存效率高,生成器特性避免中间数据存储
  3. 易于维护和扩展,可以灵活调整处理步骤顺序
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容