itertoolsについて

itertoolsというモジュールを使うことで、順列組み合わせを表現できるようです。

もっと高度なことができるようですが、自分の使い方だとそこまで使わないかな
という感じです。順列を使えるようになるとfor文のネストを減らすことができて見た目的にきれいに書けますね。

あとパッとは思いつきませんが組み合わせも割りと使う場面が多いかもしれません。

ということで、サンプルコードです。

import numpy as np
import itertools as its


#順列
a = np.arange(3)

for i, j in its.product(a, a):
    print(i, j)

#out
'''
0 0
0 1
0 2
1 0
1 1
1 2
2 0
2 1
2 2
'''

#組み合わせ
b = np.arange(5)

for i, j in its.combinations(b, 2):
    print(i, j)

#out
'''
0 1
0 2
0 3
0 4
1 2
1 3
1 4
2 3
2 4
3 4
'''

productの引数はイテレータを渡すらしいです。combinationsはイテレータと何個選ぶかを引数として渡します。

イテレータが何なのかについてははっきり言うとあまりわかっていないのですが、
まず使えるようになってから調べていこうと思います。

以下参考:
kk6.hateblo.jp

参考にさせていただいたブログには詳説が書かれているので、また勉強するときに参考にさせていただこうと思います。

実際これをpaizaの問題を解くときに導入してみたのですが、for文の二重ネストのときは最大1秒程度で
itertoolsを使った時は最大5秒もかかっていました。入力が同じかどうかが確認できないのでなんとも言えないですが、itertoolsを使った時のほうが時間が異常にかかっていました。
単純にpaizaの実行環境の問題なのか、はたまたitertoolsの使い方の問題なのかわかりませんが、使いどころは割りと見極めたほうがいいのかもしれません。