龙空技术网

一文学会在 Python 中使用过滤列表提高过滤的速度

自由坦荡的湖泊AI 277

前言:

眼前大家对“python过滤字符串”大概比较珍视,朋友们都需要学习一些“python过滤字符串”的相关资讯。那么小编同时在网络上收集了一些对于“python过滤字符串””的相关知识,希望姐妹们能喜欢,我们快快来了解一下吧!

在这里探讨在 Python 中过滤列表的两种流行且有效的方法:列表推导式和过滤函数。将比较它们的和速度,以确定哪种方法更适合您的需求。

列表推导式

列表推导式提供了一种简洁的 python 方法来过滤列表。假设有一个人员列表:Elon、Mark、Jeff 和 Carry。希望筛选此列表,以仅包含包含字母“a”的名称。

people = ['Elon', 'Mark', 'Jeff', 'Carry']new_list = [person for person in people if 'a' in person.lower()]print(new_list)# Output# ['Mark', 'Carry']

运行此代码将提供过滤后的列表,其中仅包含“Mark'和“Carry。列表推导会检查每个人的姓名是否包含字母“a”(不区分大小写),然后再将其添加到新列表中。

虽然python 列表推导式简单,但由于所需的代码量,有些人可能会发现它们在视觉上没有吸引力。

过滤器功能

另一种方法是使用内置的过滤器功能。此函数有两个参数:过滤函数和可迭代对象。筛选函数应返回 True 或 False,指示元素是否应包含在筛选列表中。

为了使用过滤器函数获得与上一个示例相同的结果,定义一个名为contains_a的过滤函数,用于检查字符串是否包含字母“a”。然后,可以使用过滤器功能将此功能应用于人员列表。

def contains_a(string):    return 'a' in string.lower()people = ['Elon', 'Mark', 'Jeff', 'Carry']new_list = list(filter(contains_a, people))print(new_list)# Output# ['Mark', 'Carry']

filter 函数消除了重复变量的需要,使代码更简洁。但是,它返回的是可迭代对象,而不是列表。如想打印过滤后的列表,我们需要使用该函数将其转换为列表。list()

性能比较

现在,比较一下列表推导式和过滤函数contains_a的性能将使用定时函数来测量每个方法的执行时间。在此示例中,将使用相同的人员列表和过滤函数。

import timeit# User-defined filter functiondef contains_a(input_var: str) -> bool:    return 'a' in input_var.lower()# Filter contents using a list comprehensiondef comp_test():    people: list[str] = ['Mario', 'Luigi', 'Toad', 'Bowser', 'Peach', 'Daisy', 'Sh']    new_people = [person for person in people if contains_a(person)]    return new_people# Filter contents using filter functiondef filter_test():    people2: list[str] = ['Mario', 'Luigi', 'Toad', 'Bowser', 'Peach', 'Daisy', 'Shy Guy']    new_people2 = filter(contains_a, people2)    return list(new_people2)# Time any functiondef get_time(func, name: str):    speed = min(timeit.repeat(func, repeat=10, number=100_000))    print(f'{name:10}: {round(speed, 4)} sec¹')    return speedif __name__ == '__main__':    filter_speed = get_time(filter_test, name='Filter')    comp_speed = get_time(comp_test, name='List comp')    # Check the speed comparison    percent_faster = round(100 * (1 - filter_speed / comp_speed))    print(f'{percent_faster}% faster')    # Check that output is the same    print('\nComp == Filter:', comp_test() == filter_test())# Output# Filter    : 0.1273 sec¹# List comp : 0.145 sec¹ # 12% faster# Comp == Filter: True

运行这段代码时,看到 filter 函数比列表推导式略快。但是,速度的差异可能因过滤条件的上下文和复杂性而异。

结论

列表推导式和 filter 函数都提供了在 Python 中过滤列表的有效方法。列表推导式简洁明了,而过滤函数在过滤条件简单时提供了一种干净的方法。在两者之间进行选择时,请考虑代码的上下文和可读性。

标签: #python过滤字符串