itertools內置模塊的妙用
過濾源迭代器中的元素
Python內置itertools模塊里有一些函數可以過濾源迭代器中的元素。
islice
islice可以在不拷貝數據的前提下,按照下標切割源迭代器。可以只給出切割的終點,也可以同時給出起點和終點,還可以指定步進值。這種切割方式與標準的序列切片及步進機制類似。
import itertoolsvalues = [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 itertoolsvalues = [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 itertoolsvalues = [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 itertoolsvalues = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]evens = lambda n: n % 2 == 0filter_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]