【Python】複数のリストに含まれる要素の全通りの組み合わせを取得する

['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')]

これだとリストが多くなってもすっきり書けますね。

現役シリコンバレーエンジニアが教えるPython入門!応用では、データ解析、データーベース、ネットワーク、暗号化、並列化、テスト、インフラ自動化、キューイングシステム、非同期処理など盛り沢山の内容です!

 

コメント