['a', 'b', 'c']、['d', 'e']という2つのリストがあり、'a'と'd'、'a'と'e'、'b'と'd'…(以下略)のような、それぞれのリストに含まれる要素の全通りの組み合わせが欲しいときの話です。
これまで私はリスト内包表記で
[(i, j) for i in ['a', 'b', 'c'] for j in ['d', 'e']]
と書いていたのですが、stackoverflowにもっとスマートな方法*1が載っていました。
>>> import itertools >>> list(itertools.product(['a', 'b', 'c'], ['d', 'e'])) [('a', 'd'), ('a', 'e'), ('b', 'd'), ('b', 'e'), ('c', 'd'), ('c', 'e')]
ちなみに、リストが3つでも問題無く全組み合わせが得られます。
>>> list(itertools.product(['a', 'b', 'c'], ['d', 'e'], ['f', 'g'])) [('a', 'd', 'f'), ('a', 'd', 'g'), ('a', 'e', 'f'), ('a', 'e', 'g'), ('b', 'd', 'f'), ('b', 'd', 'g'), ('b', 'e', 'f'), ('b', 'e', 'g'), ('c', 'd', 'f'), ('c', 'd', 'g'), ('c', 'e', 'f'), ('c', 'e', 'g')]
これだとリストが多くなってもすっきり書けますね。
*1:https://stackoverflow.com/questions/16384109/iterate-over-all-combinations-of-values-in-multiple-lists-in-python
コメント