Python dropwhile()和takewhile()过滤状态

  • Post category:Python

当需要对迭代器或可迭代对象中的元素根据某个条件进行过滤时,Python提供了两个非常常用的函数——dropwhile()takewhile()。它们都是在itertools模块中定义的函数,并非内置函数。下面我将详细讲解这两个函数的使用方法。

dropwhile()

dropwhile(predicate, iterable)函数接收两个参数:predicateiterablepredicate是一个函数,用于判断元素是否需要被过滤,iterable是一个可迭代对象,需要被过滤的元素就在其中。其中,predicate函数的输入是iterable中的每个元素,函数返回值是一个bool类型的值,代表该元素是否需要被过滤。具体过程是,从iterable中逐个取出元素,调用predicate函数,直到某个元素不符合判定条件,此时函数返回结果为True。此后,dropwhile()函数将剩余的元素全部返回,不再经过predicate函数的判定。

下面是一个简单的例子,假设有一个列表,需要将其中小于10的数全部删除并返回新列表:

from itertools import dropwhile

lst = [1, 2, 5, 10, 15, 20]

def is_less_than_10(x):
    return x < 10

new_lst = list(dropwhile(is_less_than_10, lst))

print(new_lst)  # [10, 15, 20]

上面的代码首先定义了一个判断函数is_less_than_10(),用于判断元素是否小于10。接着,使用dropwhile()函数对列表lst进行过滤,函数返回值是一个迭代器,需要使用list()将其转换成列表。最后打印过滤后的新列表。

takewhile()

dropwhile()函数不同,takewhile(predicate, iterable)函数也需要一个predicate函数和一个iterable可迭代对象作为参数,但是它返回的是在满足predicate函数条件的情况下取到的连续的元素。具体过程是,从iterable中逐个取元素,直到某个元素不符合判定条件,则返回结果为空;若元素都符合判定条件,则返回所有元素。

下面是一个简单的例子,假设需要从一个有序的列表中取出小于等于10的数:

from itertools import takewhile

lst = [1, 2, 5, 10, 15, 20]

def is_less_than_or_equal_10(x):
    return x <= 10

new_lst = list(takewhile(is_less_than_or_equal_10, lst))

print(new_lst)  # [1, 2, 5, 10]

上面的代码定义了一个判断函数is_less_than_or_equal_10(),用于判断一个元素是否小于等于10。接着,使用takewhile()函数对列表lst进行过滤,函数返回值同样是一个迭代器,需要使用list()将其转换成列表。最后打印过滤后的新列表。

通过以上例子的演示,相信你已经了解了dropwhile()takewhile()函数的使用方法,你也可以应用到自己的代码中去。