itertools

Python2.4標準モジュールのひとつ。いろいろなiteratorを生成するための便利関数が入っている。
http://www.python.jp/doc/release/lib/module-itertools.html

レシピも参照。
http://www.python.jp/doc/release/lib/itertools-recipes.html

写経モードで。

# coding: cp932
import sys
import os
from itertools import *

class ItertoolsTest:
    '''
    >>> l=chain(range(5),range(3))
    >>> list(l)
    [0, 1, 2, 3, 4, 0, 1, 2]

    >>> c=count()
    >>> c.next()
    0
    >>> c.next()
    1
    >>> c.next()
    2
    >>> c.next()
    3
    >>> c.next()
    4
    >>> c.next()
    5
    >>> c.next()
    6
    >>> c=count(100)
    >>> c.next()
    100
    >>> c.next()
    101
    >>> c.next()
    102
    >>> c.next()
    103
    >>> c.next()
    104

    >>> c=cycle(range(3))
    >>> c.next()
    0
    >>> c.next()
    1
    >>> c.next()
    2
    >>> c.next()
    0
    >>> c.next()
    1
    >>> c.next()
    2
    >>> c.next()
    0
    >>> c.next()
    1

    >>> d=dropwhile(lambda x: x<5, range(10))
    >>> list(d)
    [5, 6, 7, 8, 9]

    >>> g=groupby(range(10),lambda x: int(x/3))
    >>> [(e[0],list(e[1])) for e in g]
    [(0, [0, 1, 2]), (1, [3, 4, 5]), (2, [6, 7, 8]), (3, [9])]
    >>> g=groupby(['age', 'alone', 'boy', 'big', 'deep', 'dog', 'love', 'lost'], lambda s:s[0])
    >>> [(e[0],list(e[1])) for e in g]
    [('a', ['age', 'alone']), ('b', ['boy', 'big']), ('d', ['deep', 'dog']), ('l', ['love', 'lost'])]

    >>> f=ifilter(lambda x:x%2==0, range(10))
    >>> list(f)
    [0, 2, 4, 6, 8]
    >>> f=ifilter(None, [[1],[1,2],,[4,5,6],,,[9]])
    >>> list(f)
    [[1], [1, 2], [4, 5, 6], [9]]

    >>> f=ifilterfalse(lambda x:x%2==0, range(10))
    >>> list(f)
    [1, 3, 5, 7, 9]

    >>> m=imap(lambda x:x**2, range(10))
    >>> list(m)
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    >>> m=imap(lambda x,y:x*y, range(10),range(10,20))
    >>> list(m)
    [0, 11, 24, 39, 56, 75, 96, 119, 144, 171]

    >>> s=islice(xrange(10), 2)
    >>> list(s)
    [0, 1]
    >>> s=islice(xrange(10), 2, 8, 2)
    >>> list(s)
    [2, 4, 6]

    >>> z=izip(xrange(10), xrange(0,20,2), xrange(0,30,3))
    >>> list(z)
    [(0, 0, 0), (1, 2, 3), (2, 4, 6), (3, 6, 9), (4, 8, 12), (5, 10, 15), (6, 12, 18), (7, 14, 21), (8, 16, 24), (9, 18, 27)]
    >>> s=range(20)
    >>> z=izip(*[iter(s)]*3)
    >>> list(z)
    [(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11), (12, 13, 14), (15, 16, 17)]

    >>> r=repeat('X')
    >>> [r.next() for x in range(10)]
    ['X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X']

    >>> m=starmap(lambda x:x**2, [(i,) for i in range(10)])
    >>> list(m)
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    >>> m=starmap(lambda x,y:x*y, [(i,i+10) for i in range(10)])
    >>> list(m)
    [0, 11, 24, 39, 56, 75, 96, 119, 144, 171]

    >>> t=takewhile(lambda x:x<5, range(10))
    >>> list(t)
    [0, 1, 2, 3, 4]

    >>> x,y,z=tee(xrange(10),3)
    >>> list(x)
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(y)
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(z)
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> list(x)
    
    '''
    pass

if __name__ == '__main__':
    import doctest
    doctest.testmod()