概念:

python itertools内置库提供了12种,根据最短输入序列长度停止的迭代器,这就意味着这些迭代器支持接收一个或多个序列(sequence)作为参数,进行组合、分组和过滤等

案例:

1、itertools.accumulate(iterable,func=None):创建一个迭代器,返回累积汇总值或其他双目运算函数的累积结果值

#itertools.accumulate()
data = [2,3,8,1,0,9]
print ('itertools.accumulate1 is %s' % list(itertools.accumulate(data,func=None)))
print ('itertools.accumulate2 is %s' % list(itertools.accumulate(data,func=max)))
print ('itertools.accumulate3 is %s' %list(itertools.accumulate(data,func=min)))
print ('itertools.accumulate4 is %s' %list(itertools.accumulate(data,func=operator.mul)))

结果:func=None时默认前后相加,

          func=max比较前后两数大小,如果后数比前数小则使用前数替换后数,func=min与max相反,

          func=operator.mul前后两数相乘。

itertools.accumulate1 is [2, 5, 13, 14, 14, 23]      
itertools.accumulate2 is [2, 3, 8, 8, 8, 9]
itertools.accumulate3 is [2, 2, 2, 1, 0, 0]
itertools.accumulate4 is [2, 6, 48, 48, 0, 0] 

2、itertools.chain(*iterables):创建一个迭代器,先返回第一个可迭代对象的所有元素,再返回第二个可迭代对象的所有元素,直到返回所有可迭代对象的所有元素,处理成单个序列

#itertools.chain()
num = [1,2,3,4]
lst = ['a','b','c']
print('itertools.chain is %s '% list(itertools.chain(num,lst)))

结果:

itertools.chain is [1, 2, 3, 4, 'a', 'b', 'c']  
3、itertools.chain.from_iterable(iterable):传入一个可迭代对象参数,返回一个迭代器
 
#itertools.chain.from_iterable()
lst2 =['abc','def']
print('itertools.chain.from_iterable %s '% list(itertools.chain.from_iterable(lst2)))
 
结果:
itertools.chain.from_iterable ['a', 'b', 'c', 'd', 'e', 'f'] 
4、itertools.compress(data,selectors):创建一个迭代器,返回data经过selectors筛选真值为true的元素
 
#itertools.compress
lst3 = ['a','b','c','d','e','f']
selector = [True,False,1,2,0,-1]
print('itertools.compress %s' %list(itertools.compress(lst3,selector)))
 
结果:
itertools.compress ['a', 'c', 'd', 'f']
5、itertools.dropwhile(predicate,iterable):创建一个迭代器,如果predicate为true,迭代器丢弃这些元素。
 
#itertools.dropwhile
lst4 = [1,3,6,2,1]
print('itertools.dropwhile %s' %list(itertools.dropwhile(lambda x:x<5,lst4)))
 
结果:
itertools.dropwhile [6, 2, 1]
6、itertools.filterfalse(predicate,iterable):与dropwhile相反,返回predicate为true的元素
 
#itertools.filterfalse
lst5 = range(10)
print(list(itertools.filterfalse(lambda x:x%2,lst5)))
 
结果:
itertools.dropwhile [6, 2, 1]
7、itertools.groupby(iterable,key=None):创建一个迭代器,返回iterable连续的键和组。返回一个按照key进行分组后的值集合的迭代器,这个比较难理解下面举多个例子:
 
#itertools.groupby
print ([k for k, g in itertools.groupby('AAAABBBCCDAABBB')])
print ([list(g) for k, g in itertools.groupby(('AAABBCCADDDDD'))])
 
输出:
['A', 'B', 'C', 'D', 'A', 'B']
 [['A', 'A', 'A'], ['B', 'B'], ['C', 'C'], ['A'], ['D', 'D', 'D', 'D', 'D']] 
#itertools.groupby
for key,group in itertools.groupby('AAAABBBCCDAABBB'):
    print(key,list(group))
 
输出:
A ['A', 'A', 'A', 'A']
 B ['B', 'B', 'B']
 C ['C', 'C']
 D ['D']
 A ['A', 'A']
 B ['B', 'B', 'B']#itertools.groupby  key是len长度
 
lst6 = ['aa','ab','abc','abd','abcde']
for key,group in itertools.groupby(lst6,len):
    print (key,list(group))
 
结果:
2 ['aa', 'ab']
 3 ['abc', 'abd']
 5 ['abcde'] 
#itertools.groupby  key不区分大小写
str1 = 'AaaBBbcCAAa'
for key,group in itertools.groupby(str1,lambda m:m.upper()):
    print (key,list(group))
 
结果:
A ['A', 'a', 'a']
 B ['B', 'B', 'b']
 C ['c', 'C']
 A ['A', 'A', 'a']#itertools.groupby,iterable:一个可迭代的对象,key:一个函数,该函数的返回值作为分组标准。
 
data =[
    ('男','篮球','1.75'),
    ('男','篮球','1.75'),
    ('女','足球','1.65'),
    ('女','旅游','1.75'),
]
for key,group in itertools.groupby(data,key=lambda m:m[0]):
    print (key,list(group))
 
结果:key=lambda m:m[0],通过性别:
男 [('男', '篮球', '1.75'), ('男', '篮球', '1.75')]
 女 [('女', '足球', '1.65'), ('女', '旅游', '1.75')]结果:key=lambda m:m[1],通过爱好:
篮球 [('男', '篮球', '1.75'), ('男', '篮球', '1.75')]
 足球 [('女', '足球', '1.65')]
 旅游 [('女', '旅游', '1.75')]结果:key=lambda m:m[2],通过身高:
1.75 [('男', '篮球', '1.75'), ('男', '篮球', '1.75')]
 1.65 [('女', '足球', '1.65')]
 1.75 [('女', '旅游', '1.75')]8、itertools.islice(iterable,stop):
     itertools.islice(iterable,[start],stop,[step])
     创建一个迭代器,返回从iterable中选中的元素,start开始索引,默认是0,stop结束所 以,step步长,默认是1
 
#itertools.islice
str1 = 'ABCDEFG'
print(list(itertools.islice(str1,2)))
print(list(itertools.islice(str1,2,4)))
print(list(itertools.islice(str1,2,None)))
print(list(itertools.islice(str1,0,None,2)))
 
输出:
['A', 'B']
 ['C', 'D']
 ['C', 'D', 'E', 'F', 'G']
 ['A', 'C', 'E', 'G']9、itertools.starmap(function,iterable):调用function方法函数,来计算可迭代对象iterable里的参数
 
#itertools.starmap 调用pow方法
print (list(itertools.starmap(pow,[(2,5),(3,3),(10,3)])))

str1 = 'AabBcD' str.islower判断是否为小写
print(list(itertools.starmap(str.islower,str1)))
 
输出:
[32, 27, 1000]
 [False, True, True, False, True, False]10、itertools.takewhile(predicate,iterable):创建一个迭代器,如果predicate为false,停止迭代,与dropwhile相反
 
#itertools.takewhile
print(list(itertools.takewhile(lambda x:x<5,range(10))))
print(list(itertools.dropwhile(lambda x:x<5,range(10))))
 
输出:
[0, 1, 2, 3, 4]
 [5, 6, 7, 8, 9]11、itertools.tee(iterable,n=2):将一个iterable可迭代对象拆分成多个迭代器
 
#itertools.tee
for i in  itertools.tee(range(10),2):
    print (list(i))
 
输出
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]12、itertools.zip_longest(*iterable,fillvalue=None):创建一个迭代器,从每个可迭代对象收集元素,如果可迭代对象长度未对其,使用fillvalue值填充,观察下与zip的区别
 
#itertools.longest
str1 = 'ABCD'
str2 = 'ef'
print(list(itertools.zip_longest(str1,str2)))
print(list(itertools.zip_longest(str1,str2,fillvalue = '-')))

print (list(zip(str1,str2)))
 
输出:
[('A', 'e'), ('B', 'f'), ('C', None), ('D', None)]
 [('A', 'e'), ('B', 'f'), ('C', '-'), ('D', '-')]
 [('A', 'e'), ('B', 'f')]