itertools モジュール(3)
まだまだ続くよ。 cf. http://docs.python.jp/2.7/library/itertools.html
一番短い入力シーケンスで止まるイテレータ(つづき)
これまた map とどう違うのかわからない itertools.imap。ひょっとしてリストを返すか、イテレータを返すかの違いだけなんだろか。
>>> for x in itertools.imap(lambda y: y*2, [1,2,3,4,5]):
... print x
...
2
4
6
8
10
itertools.starmap は、イテラブルなオブジェクトを引数として受け取り、*つきで展開して関数を適用してくれる。
>>> for x in itertools.starmap(pow, [(2, 3), (3, 3), (10, 3)]):
... print x
...
8
27
1000
itertools.tee は、1つのイテラブルからn個の独立したイテレータを生成する……ってなんだかよくわからん。
>>> x, y = itertools.tee(range(5), 2)
>>> for i in x:
... print i
...
0
1
2
3
4
>>> for j in y:
... print j
...
0
1
2
3
4
第2引数nは省略するとn=2。 itertools.takewhile は Haskell の takeWhile と同じく、条件が真の間だけ値を返す。
>>> for x in itertools.takewhile(lambda y: y < 5, range(10)):
... print x
...
0
1
2
3
4
itertools.izip。これまた zip と何が違うのか。
>>> for x in itertools.izip(range(5), range(10,14)):
... print x
...
(0, 10)
(1, 11)
(2, 12)
(3, 13)
短いほうのリストにあわせるのも zip と同じ。 長いほうのリストにあわせるのが itertools.izip_longest。
>>> for x in itertools.izip_longest(range(5), range(10,14)):
... print x
...
(0, 10)
(1, 11)
(2, 12)
(3, 13)
(4, None)
引数fillvalueを指定すると、Noneの代わりにそれを使う。
>>> for x in itertools.izip_longest(range(5), range(10,14), fillvalue='x'):
... print x
...
(0, 10)
(1, 11)
(2, 12)
(3, 13)
(4, 'x')
