grouperと微妙に違うバージョン


Python2.6でitertoolsは、ライブラリ本体だけでなく、
ドキュメントのexampleにも関数が追加されています。


その一つがgrouperで、grouperは値を指定した個数毎にまとめたリストを返しますが、
半端をNoneで埋めるのが気に入らないので、単に小さいリストを返す関数を作りました。

from itertools import *

def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

def take(n, iterable):
    "Return first n items of the iterable as a list"
    return list(islice(iterable, n))

def grouper2(n, iterable):
    iterable = iter(iterable)
    x = take(n, iterable)
    while x:
        yield x
        x = take(n, iterable)



もっといい書き方があるような気もします。というか、いっそ標準で添付して欲しいです。


ちなみにgrouper2を作ったのは、wxPython製のソフトで大量のファイル名を操作するとき、
適当な頻度でwxApp::Yieldを呼ばないとウィンドウが固まるからです。


こっちもgrouper2を使うよりいい解決法がある気がします。