import itertoolsnums = itertools.count()for i in nums:if i >4:breakprint(i)01234
nums = itertools.count(10, 2)for i in nums:if i>14:breakprint(i)
Repeat 功能详解
repeat(object, times) 该函数创建一个迭代器,不断的重复 object,当然如果指定 times 的话,则只会重复 times 次
ns = itertools.repeat('AB', 3)for n in ns:print(n)ABABAB
Chain()
chain()可以把一组迭代对象串联起来,形成一个更大的迭代器:
x = itertools.chain("abc", "xyz")print(list(x))=> ['a','b','c','x','y','z']
groupby()
groupby()把迭代器中相邻的重复元素挑出来放在一起:
for key, group in itertools.groupby('AAABBBCCAAA'):print(key, list(group))A ['A','A','A']B ['B','B','B']C ['C','C']A ['A','A','A']defsortBy(score):if score >80:return"A"elif score >=60:return"B"else:return"C"scores = [81,82,84,76,64,78,59,44,55,89]for m, n in itertools.groupby(scores, key=sortBy):print(m, list(n))A [81,82,84]B [76,64,78]C [59,44,55]A [89]
我们可以看到,该函数根据我们自定义的排序函数 sortBy 将列表中的元素进行了分组操作,只是我们发现最后一个怎么多了一个 A 的分组呢,这就是我们上面说所得「当 key 函数的返回值改变时,迭代器就会生成一个新的分组」。所以,我们需要事先对列表用 sortBy 函数排一下序。
scores = [81,82,84,76,64,78,59,44,55,89]scores =sorted(scores, key=sortBy)print(scores)for m, n in itertools.groupby(scores, key=sortBy):print(m, list(n))[81,82,84,89,76,64,78,59,44,55]A [81,82,84,89]B [76,64,78]C [59,44,55]
compress 功能详解
compress(data, selectors) 该函数功能很简单,就是根据 selectors 中的值判断是否保留 data 中对应位置的值。
data = [81,82,84,76,64,78]tf = [1,1,0,1,1,0]print(list(itertools.compress(data, tf)))[81,82,76,64]