itertoolsメモ

Python2.3から標準に組み込まれている itertools というモジュールが、Pythonのマイナーバージョンに大きく依存しているので忘れないようにメモしておきます。(あくまで自分用)


詳細を知りたい方は http://docs.python.org/library/itertools.html を御覧ください。

##################
### Python 2.3 ###
##################

def chain(*iterables):
    # chain('ABC', 'DEF') --> A B C D E F

def count(start=0):
    # count(10) --> 10 11 12 13 14 ...

def cycle(iterable):
    # cycle('ABCD') --> A B C D A B C D A B C D ...

def dropwhile(predicate, iterable):
    # dropwhile(lambda x: x < 5, [1, 4, 6, 4, 1]) --> 6 4 1

def ifilter(predicate, iterable):
    # ifilter(lambda x: x % 2, range(10)) --> 1 3 5 7 9

def ifilterfalse(predicate, iterable):
    # ifilterfalse(lambda x: x % 2, range(10)) --> 0 2 4 6 8

def imap(function, *iterables):
    # imap(pow, (2, 3, 10), (5, 2, 3)) --> 32 9 1000

def islice(iterable[, start], stop[, step]):
    # islice('ABCDEFG', 2) --> A B
    # islice('ABCDEFG', 2, 4) --> C D
    # islice('ABCDEFG', 2, None) --> C D E F G
    # islice('ABCDEFG', 0, None, 2) --> A C E G
    # changed in version 2.5

def izip(*iterables):
    # izip('ABCD', 'xy') --> Ax By
    # changed in version 2.4

def repeat(object[, times]):
    # repeat(10, 3) --> 10 10 10

def starmap(function, iterable):
    # starmap(pow, [(2, 5), (3, 2), (10, 3)]) --> 32 9 1000
    # changed in version 2.6

def takewhile(predicate, iterable):
    # takewhile(lambda x: x < 5, [1, 4, 6, 4, 1]) --> 1 4

##################
### Python 2.4 ###
##################

def groupby(iterable[, key]):
    # [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B
    # [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D

def tee(iterable[, n=2]):
    # tee('ABCD', 3) --> A B C D, A B C D, A B C D

##################
### Python 2.6 ###
##################

def chain.from_iterable(iterable):
    # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F

def combinations(iterable, r):
    # combinations('ABCD', 2) --> AB AC AD BC BD CD
    # combinations(range(4), 3) --> 012 013 023 123

def izip_longest(*iterables[, fillvalue]):
    # izip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D-

def permutations(iterable[, r]):
    # permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC
    # permutations(range(3)) --> 012 021 102 120 201 210

def product(*args, **kwds)::
    # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
    # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111

##################
### Python 2.7 ###
##################

def combinations_with_replacement(iterable, r):
    # combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC

def compress(data, selectors):
    # compress('ABCDEF', [1, 0, 1, 0, 1, 1]) --> A C E F

def count(start=0, step=1):
    # count(10) --> 10 11 12 13 14 ...
    # count(2.5, 0.5) --> 2.5 3.0 3.5 4.0 ...

上記サイトには面白いサンプルも載っていますので、目を通しておくとほんの少し幸せになれるかもしれません。

例えば

from itertools import *

def roundrobin(*iterables):
    """
        roundrobin('ABC', 'D', 'EF') --> A D E B F C
    """
    pending = len(iterables)
    nexts = cycle(iter(it).next for it in iterables)
    while pending:
        try:
            for next in nexts:
                yield next()
        except StopIteration:
            pending -= 1
            nexts = cycle(islice(nexts, pending))

とかちょっとトリッキーで楽しいですね。

ただ、Python2.4〜2.7でのバージョンによる違いが大きいモジュールなので、気軽には使いたくないモジュールです。