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]