Python的内建模块itertools
提供了非常有用的用于操作迭代对象的函数。
(1)itertools.count()
会创建一个无限自然数序列的迭代器,根本停不下来。
itertools.count(1) # 1,2,3,...
(2)cycle()
会把传入的一个序列无限重复下去
itertools.cycle('ABC') # A,B,C,A,B,C,...
(3)chain()
可以把一组迭代对象串联起来,形成一个更大的迭代器
itertools.chain('ABC', 'XYZ') # 迭代效果:'A' 'B' 'C' 'X' 'Y' 'Z'
(4)repeat()
负责把一个元素无限重复下去,不过如果提供第二个参数就可以限定重复次数
itertools.repeat('A', 10) # 打印10次'A'
(5)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']
>>> for key, group in itertools.groupby('AaaBBbcCAAa', lambda c: c.upper()):
... print key, list(group)
...
A ['A', 'a', 'a']
B ['B', 'B', 'b']
C ['c', 'C']
A ['A', 'A', 'a']
(6)imap()
和map()
的区别在于,imap()
可以作用于无穷序列,并且,如果两个序列的长度不一致,以短的那个为准。
imap()
实现了“惰性计算”,也就是在需要获得结果的时候才计算。
>>> for x in itertools.imap(lambda x, y: x * y, [10, 20, 30], itertools.count(1)):
... print x
...
10
40
90
(7)ifilter()
就是filter()
的惰性实现。
(8)itertools.product(
list1, list2)
,返回list1、list2中的元素的笛卡尔积的元组。即,依次取出list1中的每1个元素,与list2中的每1个元素,组成元组,然后,将所有的元组组成一个列表,返回。
>>> for item in itertools.product([1,2,3],[100,200]):
... print item
...
(1, 100)
(1, 200)
(2, 100)
(2, 200)
(3, 100)
(3, 200)
python字符串中连续相同字符个数:
import itertools
res = [(k, len(list(g))) for k, g in itertools.groupby('TTFTTTFFFFTFFTT')]
res:[('T', 2), ('F', 1), ('T', 3), ('F', 4), ('T', 1), ('F', 2), ('T', 2))]
参考:
https://www.liaoxuefeng.com/wiki/897692888725344/983420006222912