itertools是Python自带的一个非常实用的模块,甚至是百度翻译都对其用途“熟稔于心”。
itertools 模块包含了一系列用来产生不同类型迭代器的函数或类,这些函数的返回都是一个迭代器,我们可以通过 for 循环来遍历取值,也可以使用 next() 来取值。
这里也顺便提一下next()函数:
作为Python内置函数,
next() 返回迭代器的下一个项目;
next() 函数要和生成迭代器的 iter() 函数一起使用。
mylist = iter(["apple", "banana", "cherry"])
x = next(mylist)
print(x)
x = next(mylist)
print(x)
x = next(mylist)
print(x)
运行结果:
apple
banana
cherry
mylist = iter(["apple", "banana", "cherry"])
x = next(mylist, "orange")
print(x)
x = next(mylist, "orange")
print(x)
x = next(mylist, "orange")
print(x)
x = next(mylist, "orange")
print(x)
运行结果:
apple
banana
cherry
orange
itertools 模块提供的迭代器函数有以下几种类型:
无限迭代器:生成一个无限序列,比如自然数序列 1, 2, 3, 4, …;
有限迭代器:接收一个或多个序列(sequence)作为参数,进行组合、分组和过滤等;
组合生成器:序列的排列、组合,求序列的笛卡儿积等;
itertools中的函数:
部分功能示例:
count
count() 接收两个参数,第一个参数为起始值,默认为 0,第二个参数为步长,默认为 1。
#encoding:utf-8
import itertools
nums = itertools.count(2,2)
for i in nums:
if i == 10:
break
else:
print(i)
运行结果:
2
4
6
8
repeat
repeat() 用于反复生成一个 object:
for item in itertools.repeat('hello world', 3):
print(item)
for item in itertools.repeat([1, 2, 3, 4], 3):
print(item)
运行结果:
hello world
hello world
hello world
[1, 2, 3, 4]
[1, 2, 3, 4]
[1, 2, 3, 4]
cycle
cycle_strings = itertools.cycle('ABC')
i = 1
for string in cycle_strings:
if i == 10:
break
else:
print(i, string)
i += 1
运行结果:
1 A
2 B
3 C
4 A
5 B
6 C
7 A
8 B
9 C
compress
compress 可用于对数据进行筛选,当 selectors 的某个元素为 true 时,则保留 data 对应位置的元素,否则去除:
print(list(itertools.compress('ABCDEF', [1, 1, 0, 1, 0, 1])))
print(list(itertools.compress('ABCDEF', [1, 1, 0, 1])))
print(list(itertools.compress('ABCDEF', [True, False, True])))
运行结果:
['A', 'B', 'D', 'F']
['A', 'B', 'D']
['A', 'C']
dropwhile
dropwhile包含两个参数,
形式如dropwhile(predicate, iterable)
:
其中,predicate 是函数,iterable 是可迭代对象。对于 iterable 中的元素,如果 predicate(item) 为 true,则丢弃该元素,否则返回该项及所有后续项。
print(list(itertools.dropwhile(lambda x: x < 5, [1, 3, 6, 2, 1])))
运行结果:
[6, 2, 1]
islice
islice 是切片选择,它的使用形式为:islice(iterable, [start,] stop [, step])
print(list(itertools.islice([10, 6, 2, 8, 1, 3, 9], 5)))
print(list(itertools.islice([10, 6, 2, 8, 1, 3, 9], 2,5,1)))
运行结果:
[10, 6, 2, 8, 1]
[2, 8, 1]
permutations
生成全排列
print(list(itertools.permutations('ABC')))
print(list(itertools.permutations('ABC', 2)))
运行结果:
[('A', 'B', 'C'), ('A', 'C', 'B'), ('B', 'A', 'C'), ('B', 'C', 'A'), ('C', 'A', 'B'), ('C', 'B', 'A')]
[('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]
combinations
产生组合
print(list(itertools.combinations('ABC', 2)))
print(list(itertools.combinations_with_replacement('ABC', 2)))
运行结果:
[('A', 'B'), ('A', 'C'), ('B', 'C')]
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]
相关博文参考:
babay神——python 高效的 itertools 模块