どくとる・めも

化学、数学、プログラミング、英語などに関する諸々

【Python】itertoolsで省力化

背景

psi4でなんか適当な低分子でもOptして遊んでみるかと思っていたところ、本題から逸れる形で"itertools"なるライブラリの存在を知った。読んで字のごとく、なにかしらの繰り返し処理を行ってくれるヤツなのだろう。便利そうなので紹介。

※えらそうな出だしを書いてみたが、私のプログラミングの知識はかなり浅い。赤子レベルだ。稚拙な論理とソースコードを許せる方のみ、読み進めていただきたい。

 

異なるリストの要素同士を組み合わせる

実際にはitertoolsはかなり強力でgroupbyのような便利な関数も使えるらしい[1]のだが、ここではproductpermutationを取り上げる。

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は役に立ちそうだ。なにかしらの分析機器にサンプルを突っ込む際に、どのバイアルがなんのサンプルなのかというテーブルをちまちま作ったりするけど、このライブラリはそれを効率化してくれるものとして期待できる。

余談

ブログ上にソースコードを掲載する以上、やはりplain textではなく何かしらビジュアル上の工夫を施すべきだと思って色々探し、その結果見つけたはてな記法[2]を、不慣れなままに使ってみて出来たエントリがこれだ。htmlのようなややこしい記法をせずにビジュアル面を工夫できるので、今後も重宝したい。ほんとはforとかiとかjとかに色をつけ、カラフルなソースコードにしてもっとわかりやすくしたいのだけど、それはまた次回以降。将来的にはhtmlも軽く勉強して、スクレイピングとかやってみたいなぁと思っています。