まだまだ続くよ。
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')