itertools模块
前言
模块itertools提供用于操作迭代对象的函数,官网标准库文档链接: link.
itertools提供的3个“无限”迭代器
- count():count(10) --> 10 11 12 13 14 …
import itertools
#def count(start=0, step=1)默认参数
nums=itertools.count(0,1)#count返回的是一个无限迭代的数字队列,输出要遍历
for i in nums:
print(i)#会无限打印,需要手动停止运行
- cycle():cycle(‘ABCD’) --> A B C D A B C D …
#def cycle(iterable)#把传入的一个序列无限重复下去
letters=itertools.cycle('xiaoxiannv')#字符串也是序列的一种
for letter in letters:
print(letter)
- repeat():repeat(10, 3) --> 10 10 10
#def repeat(object, times=None)把一个元素无限重复下去,如果提供第二个参数就可以限定重复次数
nms=itertools.repeat('hello',2)
for i in nms:
print(i)
PS:无限序列只有在for迭代时才会无限地迭代下去,如果只是创建了一个迭代对象,它不会事先把无限个元素生成,事实上也不可能在内存中创建无限多个元素。
itertools提供多个迭代器操作函数
无限序列虽然可以无限迭代下去,但可以通过itertools提供的的迭代器操作函数进行计算,截取,拼接,筛选等操作:
- accumulate()制作一个迭代器,返回其他二进制函数的累积结果(通过可选func参数指定)。
#def accumulate(iterable, func=operator.add, *, initial=None)
nums_sum=itertools.accumulate([1,2,3,4,5])
for i in nums_sum:
print(i)
nums_initial=itertools.accumulate([1,2,3,4,5],initial=100)
for i in nums_initial:
print(i)
nums_operator=itertools.accumulate([1,2,3,4,5],operator.mul)
for i in nums_operator:
print(i)
nums_min=itertools.accumulate([1,2,3,4,5],min)
for i in nums_min:
print(i)
# accumulate([1,2,3,4,5]) --> 1 3 6 10 15
# accumulate([1,2,3,4,5], initial=100) --> 100 101 103 106 110 115
# accumulate([1,2,3,4,5], operator.mul) --> 1 2 6 24 120
#accumulate([1,2,3,4,5],min) --> 1 1 1 1 1
- chain()可以把一组迭代对象串联起来,形成一个更大的迭代器。
#def chain(*iterables)
# chain('ABC', '123') --> A B C 1 2 3
letters=itertools.chain('AHDB','21ygywd2')
for i in letters:
print(i)
- 以下这些还没用到过,作为扩展先捋一下:
函数 | 描述 | 例子 |
---|---|---|
compress() | 选择器 | compress(‘ABCDEF’, [1,0,1,0,1,1]) --> A C E F |
dropwhile() | 跳过可迭代对象的开始部分 | dropwhile(lambda x: x<5, [1,4,6,4,1]) --> 6 4 1 |
filterfalse()/filter() | 过滤器,返回符合要求的值/过滤掉符合要求的值 | filterfalse(lambda x: x%2, range(10)) --> 0 2 4 6 8 |
groupby() | 根据表本身的某一列或多列内容进行分组聚合 | 参考下方代码块 |
islice() | 切片算法类似[start:end:step] | islice(‘ABCDEFG’, 2, None) --> C D E F G |
starmap() | 选择器 | compress(‘ABCDEF’, [1,0,1,0,1,1]) --> A C E F |
takewhile() | 选择器 | compress(‘ABCDEF’, [1,0,1,0,1,1]) --> A C E F |
tee() | 选择器 | compress(‘ABCDEF’, [1,0,1,0,1,1]) --> A C E F |
zip_longest() | 选择器 | compress(‘ABCDEF’, [1,0,1,0,1,1]) --> A C E F |
#islice(iterable, start,end,step)用法对比[start:end:step]
flat = ['2', '3', '5', '7', '11', '13', '17', '19',
'23', '29', '31', '37', '41', '43', '47', '53',
'59', '61', '67', '71']
print(type(flat))
print(flat[0::2])#-->['2', '5', '11', '17', '23', '31', '41', '47', '59', '67']
print(flat[1::2])#-->['3', '7', '13', '19', '29', '37', '43', '53', '61', '71']
print(list(zip(flat[0::2], flat[1::2])))#-->[('2', '3'), ('5', '7'), ('11', '13'), ('17', '19'), ('23', '29'), ('31', '37'), ('41', '43'), ('47', '53'), ('59', '61'), ('67', '71')]
flat_iter_1 = iter(flat)
flat_iter_2 = iter(flat)
nums=zip(
itertools.islice(flat_iter_1, 0, None, 2),
itertools.islice(flat_iter_2, 1, None, 2)
)
print(list(nums))#-->[('2', '3'), ('5', '7'), ('11', '13'), ('17', '19'), ('23', '29'), ('31', '37'), ('41', '43'), ('47', '53'), ('59', '61'), ('67', '71')]