python标准库之itertools

1、tee
创建n个与iterable相同的独立迭代器。

for i in itertools.tee([1,2,3,4,5,6], 2):
    for j in i:
        print(j)

1
2
3
4
5
6
1
2
3
4
5
6

2、accumulate
accumulate迭代器返回累加之和或者两个函数(开发者可以传递给accumulate)的累计结果,accumulate的默认操作是相加,如下,首先我们引入accumulate方法,然后传递给它0-9这个序列,它就会将它们依次相加,例如第一个是0,第二个是0+1,第三个是1+2,等等;

from itertools import accumulate
list(accumulate(range(10)))
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]

下面我们引入operator模块,我们首先将数字1-4传递给accumulate迭代器,另外又将operator.mul传递给它,它接受这个函数用于相乘。所以每次迭代,它相乘而非是相加(1 * 1 = 1,1 * 2 = 2,2 * 3 = 6,等等)。



>>> from itertools import accumulate
>>> import operator
>>> list(accumulate(range(1,5),operator.mul))
[1, 2, 6, 24]

3、chain
itertools.chain(*iterables)
*iterables为一个或多个可迭代序列
作用:返回所有可迭代序列

import itertools
its=["a","b","c","d"]
hers=["A","B","C","D"]
others=["1","2","3","4"]
for item in itertools.chain(its,hers,others):
    print (item)

a
b
c
d
A
B
C
D
1
2
3
4

4、combinations
如果你需要创建组合,Python提供了itertools.combinations。combinations允许你从一个可迭代对象中创建一个迭代器,迭代中的元素长度都相同。

>>> from itertools import combinations
>>> list(combinations('WXYZ',2))
[('W', 'X'), ('W', 'Y'), ('W', 'Z'), ('X', 'Y'), ('X', 'Z'), ('Y', 'Z')]

5、combinations_with_replacement
combinations_with_replacement类似于combinations,唯一的区别就是它会创建重复的组合。

from itertools import combinations_with_replacement
list(combinations_with_replacement('WXYZ',2))
[('W', 'W'), ('W', 'X'), ('W', 'Y'), ('W', 'Z'), ('X', 'X'), ('X', 'Y'), ('X', 'Z'), ('Y', 'Y'), ('Y', 'Z'), ('Z', 'Z')]

6、permutations
permutations迭代器将会从可迭代对象中返回连续的、长度为r的元素排列,和combinations一样,permutations也是从排序顺序进行排列。

>>> from itertools import permutations
>>> for item in permutations('WXYZ',2):
...     print(''.join(item))
...     
...
WX
WY
WZ
XW
XY
XZ
YW
YX
YZ
ZW
ZX
ZY

7、compress
itertools.compress(data, selectors)
data为数据对象
selectors为选择器(规则)
作用:返回数据对象中对应规则为True的元素

import itertools
its=[“a”,“b”,“c”,“d”,“e”,“f”,“g”,“h”]
selector=[True,False,1,0,3,False,-2,“y”]
for item in itertools.compress(its,selector):
print (item)

a
c
e
g
h

8、count
创建一个迭代器,生成从n开始的连续整数,如果忽略n,则从0开始计算(注意:此迭代器不支持长整数)

import itertools
for item in itertools.count(1,3):
      if item>20:
       break
      print(item)
...
1
4
7
10
13
16
19
>>>

9、cycle
传入一个序列,无限循环下去

import itertools
its=["a","b","c","d"]
for item in itertools.cycle(its):
    print (item)
a
b
c
d
a
b

10、dropwhile
从头开始,干掉不符合的元素,直到第一个正确元素。

for i in itertools.dropwhile(lambda x:x<7,[1,2,3,6,7,8,2,4,5,9]):
   print(i)
...
7
8
2
4
5
9

11、filterfalse
输出为错的要素:

for i in itertools.filterfalse(lambda x:x<7,[1,2,3,6,7,8,2,4,5,9]):
print(i)

7
8
9

12、groupby
将iterable同要素聚合输出:

for k,g in itertools.groupby('aaAAaBBBCCCCC'):
    print(k)
    print(list(g))

13、islice
切片操作的迭代器版本

>>> for i in itertools.islice('fengliutitangShawn',0,None,2):
...     print(i)

14、product
itertools.product(iterables[,repeat=1])
iterables进行笛卡尔积运算

for i in itertools.product(‘Tom’,‘Jerry’,repeat=1):
print(i)

('T', 'J')
('T', 'e')
('T', 'r')
('T', 'r')
('T', 'y')
('o', 'J')
('o', 'e')
('o', 'r')
('o', 'r')
('o', 'y')
('m', 'J')
('m', 'e')
('m', 'r')

15、repeat
创建一个迭代器,重复生成object,times(如果已提供)指定重复计数,如果未提供times,将无止尽返回该对象。

import itertools
its=["a","b","c"]
for item in itertools.repeat(its,4):
    print (item)

[‘a’, ‘b’, ‘c’]
[‘a’, ‘b’, ‘c’]
[‘a’, ‘b’, ‘c’]
[‘a’, ‘b’, ‘c’]

16、starmap
starmap会创建一个新的迭代器,这个迭代器使用传入函数和可迭代对象进行计算,正如文档提到的,map()和starmap()的区别就是传入的函数分别是function(*c)和function(a,b)。

import itertools
for i in itertools.starmap(lambda x, y: x+y, [(2,3), (4,5)]):
    print(i)
for j in map(lambda x: pow(x, 2), [2, 3, 4]):
    print(j)

5
9
4
9
16

17、takewhile

for i in itertools.takewhile(lambda x:x<7,[1,2,3,6,7,8,2,4,5,9]):
print(i)

1
2
3
6

18、zip_longest
zip_longest(Python3支持)可以用于将两个可迭代对象打包在一起,如果可迭代对象的长度不同,你可以传入fillvalue,

>>> from itertools import zip_longest
>>> for item in zip_longest('ABCD','xy',fillvalue = 'BLANK'):
...     print (item)
...
('A', 'x')
('B', 'y')
('C', 'BLANK')
('D', 'BLANK')


上述代码中,我们引入zip_longest,并且传入两个字符串。你就会注意到第一个字符串右4个字符,第二个字符串只有2个字符,我们设置了fillvalue = 'BLANK',当我们遍历元素并且将其打印出来时,你可以观察到我们得到的是元素。

前两个元组是第一个字符串和第二个字符中相应的字母,最后两个元素是fillvalue。

如果传入到zip_longest中是无限的迭代对象,这时候需要我们通过islice等限制调用次数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值