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')