python itertools模块

合并和分解迭代器

  • chain 用于合并多个迭代器, 利用chain可以轻松处理多个序列。
from itertools import chain 
for i in chain([1,2,3], ['a', 'b', 'c']):
    print(i)

结果为:

1
2 
3 
a 
b 
c
  • izip 用于将多个迭代器中的元素组合到一个元组中,这个在py3中被zip取代。
# from itertools import izip
for i in zip([1,2,3], ['a','b', 'c']):
    print(i)
from itertools import izip
for i in izip([1,2,3], ['a','b', 'c']):
    print i

结果为:

(1,'a') 
(2,'b') 
(3,'c')
  • islice 返回一个迭代器,它按索引返回由输入迭代器所选的元素。
from itertools import islice
print("Stop at 5")

for i in islice(count(), 5):
    print (i )
print ("Start at 5, stop at 10")
for i in islice(count(), 5,10):
    print (i)
print ("By tens to 100")
for i in islice(count(), 0, 100, 10):
    print (i)
Stop at 5
0
1
2
3
4
Start at 5, stop at 10
5
6
7
8
9
By tens to 100
0
10
20
30
40
50
60
70
80
90

count()用于生成无限连续整数,后面会讲到。

  • tee 根据一个原输入迭代器返回多个独立的迭代器, 默认为两个。
from itertools import tee,islice,count
r = islice(count(), 5)
i1, i2 = tee(r)
for i,j in zip(i1,i2):
    print(i,j)
0 0
1 1
2 2
3 3
4 4

tee()创建的迭代器共享其输入迭代器,所以一旦创建了新迭代器,就不应该再使用远迭代器。

如果原迭代器的值已经使用,新迭代器不会再生成这些值。

转换输入

  • imap 返回一个迭代器,它对输入迭代器中的值调用一个函数并返回结果。imap函数的工作方式类似于内置函数map,只不过只要某个输入迭代器中的元素使用完,imap函数就会停止。同样,在py3中,可以用map代替。
print ("Doubles:" )
for i in map(lambda x:2*x, range(5)):
    print (i)
print ("Multiples:")
for i in map(lambda x, y:(x,y, x*y), range(5), range(5, 10)):
    print ('%d * %d = %d' % i)
from itertools import *

print "Doubles:"
for i in imap(lambda x:2*x, xrange(5)):
    print i

print "Multiples:"
for i in imap(lambda x, y:(x,y, x*y), xrange(5), xrange(5, 10)):
    print '%d * %d = %d' % i

结果如下:

0
2
4
6
8
Multiples:
0 * 5 = 0
1 * 6 = 6
2 * 7 = 14
3 * 8 = 24
4 * 9 = 36
  • starmap starmap类似于imap函数,不过它并不是使用多个迭代器来构建一个tuple, 而是使用*语法来分解一个迭代器中的元素来作为映射函数的参数。
from itertools import starmap
values = [[0,5], [1,6], [2,7], [3,8]]
for i in starmap(lambda x, y:(x, y, x*y), values):
    print ('%d * %d = %d' % i)

输出结果如下:

0 * 5 = 0
1 * 6 = 6
2 * 7 = 14
3 * 8 = 24

imap的函数映射名为f(i1, i2), 而传入starmap()的映射函数名为f(*i)。

生成新值

  • count 返回一个迭代器,能够无限的生成连续整数,第一个数可以作为参数传入,默认为0,这里没有上界参数。
from itertools import count

for i in zip(count(1), ['a', 'b', 'c']):
    print (i)

输出结果如下:

(1, 'a')
(2, 'b')
(3, 'c')
  • cycle 返回一个迭代器,它会无限的重复给定参数的内容。由于必须记住输入迭代器的全部内容,因此如果这个迭代器比较长,可能会比较消耗内存。
from itertools import cycle
for i in zip(range(7), cycle(['a', 'b', 'c'])):
    print(i)

输出结果如下:

(0, 'a') 
(1, 'b') 
(2, 'c') 
(3, 'a') 
(4, 'b') 
(5, 'c') 
(6, 'a')
  • repeat 返回一个迭代器,每次访问都会生成相同的值。
from itertools import repeat
for i in repeat("over and over ", 5):
    print(i)

输出结果如下:

over and over 
over and over 
over and over 
over and over 
over and over 

repeat返回的迭代器会一直返回数据,除非提供了可选的times参数来限制次数。

过滤

  • dropwhile 该函数返回一个迭代器,它会生成输入迭代器中条件第一次为false之后的元素。
from itertools import *
def should_drop(x):
    print( "Testing:", x)
    return (x<1)
for i in dropwhile(should_drop, [-1, 0, 1, 2, -2]):
    print("Yielding:", i)

输出结果如下:

Testing: -1
Testing: 0
Testing: 1
Yielding: 1
Yielding: 2
Yielding: -2

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颐水风华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值