今川館

都内勤務の地味OLです

enumerateの代わりにitertoolsを使ってみる

itertoolsのについてメモ -- 似非言語オタクの戯言 http://d.hatena.ne.jp/aitahoge/20110517/1305611498

この記事を読んでいて気づいたこと。

count(start=0, step=1)
名前のとおり、next()が呼び出される度にカウントされる。
izip()との併用とか、enumerateが使いにくいケースに良いと思われ。

なるほど。

  1. 今までわざわざカウンターを書いていたが必要ない。itertools.countを素直に使うべき。
  2. enumerate関数が必ず0から始まるので、1から始めたい場合などはitertools.izipと組み合わせて使う。

サンプル::

# -*- coding:utf-8 -*-
import itertools

def main():
    # 2ずつステップ
    odds = itertools.count(1, 2)
    print(odds.next()) #=> 1
    print(odds.next()) #=> 3
    print(odds.next()) #=> 5

    for i, j in itertools.izip(itertools.count(1), [1, 2, 3]):
        print(i, j, i * j)
    #=> (1, 1, 1)
    #=> (2, 2, 4)
    #=> (3, 3, 9)


if __name__ == "__main__":
    main()

注意点としては、itertools.countにstep引数を渡せるのはpython2.7以降のようだ。
2.6系のpythonでやろうとしたら引数が多すぎるというエラーになった。