当需要对迭代器或可迭代对象中的元素根据某个条件进行过滤时,Python提供了两个非常常用的函数——dropwhile()
和takewhile()
。它们都是在itertools
模块中定义的函数,并非内置函数。下面我将详细讲解这两个函数的使用方法。
dropwhile()
dropwhile(predicate, iterable)
函数接收两个参数:predicate
和iterable
,predicate
是一个函数,用于判断元素是否需要被过滤,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()
函数的使用方法,你也可以应用到自己的代码中去。