【Python】itertoolsで省力化
背景
psi4でなんか適当な低分子でもOptして遊んでみるかと思っていたところ、本題から逸れる形で"itertools"なるライブラリの存在を知った。読んで字のごとく、なにかしらの繰り返し処理を行ってくれるヤツなのだろう。便利そうなので紹介。
※えらそうな出だしを書いてみたが、私のプログラミングの知識はかなり浅い。赤子レベルだ。稚拙な論理とソースコードを許せる方のみ、読み進めていただきたい。
異なるリストの要素同士を組み合わせる
実際にはitertoolsはかなり強力でgroupbyのような便利な関数も使えるらしい[1]のだが、ここではproductとpermutationを取り上げる。
itertools.product
まずはproductから。以下のようなコードを書いてみた。
import itertools solvents = ["water", "methanol", "hexane"] solutes = ["sugar", "salt"] for i, j in itertools.product(solvents, solutes): print(j + " in " + i)
実行すると、次のような結果が返される。
sugar in water salt in water sugar in methanol salt in methanol sugar in hexane salt in hexane
要するに、溶媒3種と溶質2種について、あり得る組み合わせを出力してくれた(砂糖や塩がヘキサンに溶けるのかはともかく)。 う〜ん便利。
ポイントは上の例のsolventsおよびsolutesのように複数のリストを作っておき、それらを
itertools.product(list A, list B)
と書くことだ。なお、自明ではあるが、先ほどのforループのiとjはそれぞれsolventsとsolutesに対応している。
itertools.permutations
私がまだ高校生だったころに、数学Aで出てきたあいつである。ともかくやってみよう。
numbers = [1, 2, 3] print(list(itertools.permutations(numbers)))
すると以下が返される。
[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
1, 2, 3という3つの数の並べ方としてあり得るものを出力してくれた。これも便利。気をつけるべきは、出力したい結果はあらかじめリスト化しておく必要があるという点。permutationsからの類推でcombinationも使えるようだが、今回は省略。
まとめ
permutationやcombinationを実際の業務に生かすビジョンはあまり見えないが、productは役に立ちそうだ。なにかしらの分析機器にサンプルを突っ込む際に、どのバイアルがなんのサンプルなのかというテーブルをちまちま作ったりするけど、このライブラリはそれを効率化してくれるものとして期待できる。