python中的itertools模块

itertools标准化了一个快速、高效利用内存的核心工具集,这些工具本身或组合都很有用。它们一起形成了“迭代器代数”,这使得在纯Python中有可能创建简洁又高效的专用工具。

“无限”迭代器

count()会创建一个无限的迭代器,所以上述代码会打印出自然数序列,根本停不下来,只能按Ctrl+C退出

1
2
3
4
>>> import itertools
>>> natuals = itertools.count(1)
>>> for n in natuals:
... print(n)

cycle()会把传入的一个序列无限重复下去

1
2
3
4
>>> import itertools
>>> cs = itertools.cycle('ABC') # 注意字符串也是序列的一种
>>> for c in cs:
... print(c)

repeat()负责把一个元素无限重复下去,不过如果提供第二个参数就可以限定重复次数:

1
2
3
4
>>> ns = itertools.repeat('A', 3)
>>> for n in ns:
... print(n)
...

根据最短输入序列长度停止的迭代器

accumulate()创建一个迭代器,返回累积汇总值或其他双目运算函数的累积结果值

1
2
3
4
5
6
7
8
>>> ns = itertools.accumulate((1,2,3,4))
>>> for n in ns:
... print(n)
...
1
3
6
10

chain()可以把一组迭代对象串联起来,形成一个更大的迭代器

1
2
3
>>> for c in itertools.chain('ABC', 'XYZ'):
... print(c)
# 迭代效果:'A' 'B' 'C' 'X' 'Y' 'Z'

groupby()把迭代器中相邻的重复元素挑出来放在一起:

1
2
3
4
5
6
7
>>> 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']

chain.from_iterable 构建类似 chain() 迭代器的另一个选择。

1
2
3
4
5
6
7
8
9
10
>>> abc=itertools.chain.from_iterable(["abc","cde"])
>>> for a in abc:
... print(a)
...
a
b
c
c
d
e

参考文献

  1. https://docs.python.org/zh-cn/3/library/itertools.html#itertools.chain.from_iterable
  2. https://www.liaoxuefeng.com/wiki/1016959663602400/1017783145987360