itertools内置模块的妙用
过滤源迭代器中的元素
Python内置itertools模块里有一些函数可以过滤源迭代器中的元素。
islice
islice可以在不拷贝数据的前提下,按照下标切割源迭代器。可以只给出切割的终点,也可以同时给出起点和终点,还可以指定步进值。这种切割方式与标准的序列切片及步进机制类似。
import itertools
values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
first_five = itertools.islice(values, 5)
print('First Five:', list(first_five))
middle_odds = itertools.islice(values, 2, 8, 2)
print('Middle Odds:', list(middle_odds))
>>>
First Five: [1, 2, 3, 4, 5]
Middle Odds: [3, 5, 7]
takewhile
takewhile会一直从源迭代器里获取元素,直到某元素让测试函数返回False为止。
import itertools
values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
less_than_seven = lambda x: x // 7 == 0
it = itertools.takewhile(less_than_seven, values)
print(list(it))
>>>
[1, 2, 3, 4, 5, 6]
dropwhile
与takewhile相反,dropwhile会一直跳过源序列里的元素,直到某元素让测试函数返回True为止,然后它会从这个地方开始逐个取值。
import itertools
values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
less_than_seven = lambda x: x // 7 == 0
it = itertools.dropwhile(less_than_seven, values)
print(list(it))
>
[7, 8, 9, 10]
filterfalse
filterfalse和内置的filter函数相反,它会逐个输出源迭代器里使得测试函数返回False的那些元素。
import itertools
values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
evens = lambda n: n % 2 == 0
filter_result = filter(evens, values)
print('Filter: ', list(filter_result))
filter_false_result = itertools.filterfalse(evens, values)
print('Filter false: ', list(filter_false_result))
>>>
Filter: [2, 4, 6, 8, 10]
Filter false: [1, 3, 5, 7, 9]