itertools模块(二)

322 阅读3分钟

1.有限序列迭代器

1.1 accumulate函数

用于返回运算的累积结果。类似于reduce()函数,默认的运算为求和运算

1.1.1加法求和

from itertools import accumulate
​
print(list(accumulate(range(10))))

result:

[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]

可以看到, 返回结果的每一项为开头到当前位置位置所有元素的和。比如第3项元素为3=0+1+2,第6项元素15=0+1+2+3+4+5.依次类推

1.1.2 乘法求积

import operator
from itertools import accumulate
​
print(list(accumulate(range(1, 10),operator.mul)))

result:

[1, 2, 6, 24, 120, 720, 5040, 40320, 362880]

可以看到, 返回结果的每一项为开头到当前位置位置所有元素的积。比如第3项元素为6=1×2×3,第6项元素720=1×2×3×4×5×6.依次类推

1.2 chain函数

chain(*iterables): iterables:传入的迭代器

把传入的多个迭代器拼接成一个迭代器,并且按传入顺序进行迭代

from itertools import chain
​
list1 = [1, 2, 3]
str1 = 'abcd'
tuple1 = (4, 5, 6)
​
for num in chain(list1, str1, tuple1):
    print(num)

result:

1
2
3
a
b
c
d
4
5
6

1.3 chain.form_iterable函数

用法和chain函数一样,不再赘述

from itertools import chain
​
list1 = [1, 2, 3]
str1 = 'abcd'
tuple1 = (4, 5, 6)
​
for num in chain.from_iterable([list1, str1, tuple1]):
    print(num)

result:

1
2
3
a
b
c
d
4
5
6

1.4 compress函数

compress(data, selector):

data:一个可以用来迭代的数据

selector:选择器,用来对data进行筛选

生成一个筛选后的迭代器。筛选规则是这样的,当selector的第i个值为真,则保留data的第i个值。反之则舍弃。此处不要求selector的长度必须等于data的长度

from itertools import compress
​
list1 = [1, 2, 3, 5, 6, 7]
selector = [1, 0, 0, 2]
for num in compress(list1, selector):
    print(num)

result:

1
5

这里对执行结果做一个解释。我们依次遍历selector中的元素,获取该元素的索引,依照该索引取到list1中的元素。

当selector中的元素为真时,予以保留list1中的元素。反之则不保留list1中的元素。因为selector[0]=1为真, 所以输出结果保留list1[0]=1;selector[1]=0为假, 所以输出结果不保留list1[1]=2。同理可得,iist1[2]=3不保留,list1[4]=5保留。所以最终的输出结果为1和5,

另外,这里的list1长度为6,selector的长度为4,意思只对list1中的前4个元素进行筛选,后面的2个不涉及筛选,所以输出结果中自然不会有最后2个元素6和7

1.5 dropwhile函数

dropwhile(predicate, iterable):

predicate:一个判断函数,它的返回值是一个bool类型

iterable:一个可迭代对象

将iterable的元素依次代入predicate进行判断,若结果为True则去除,为False则予以保留。最后生成一个新的迭代器

from itertools import dropwhile
​
for i in dropwhile(lambda x: x < 3, [1, 2, 3, 4, 5]):
    print(i)

result:

3
4
5

1.6 filterfalse函数

filterfalse(predicate, iterable):

predicate:断言,一个判断函数,它的返回值是一个bool类型

iterable:一个可迭代对象

将iterable的元素中不满足predicate的元素过滤后生成一个新的迭代器

from itertools import filterfalse
​
for i in filterfalse(lambda x: x < 3, [1, 2, 3, 4, 5]):
    print(i)

result:

3
4
5