業務でPOSデータから一定期間内の特定のユーザーの購買の組み合わせを集計したいと思った際に購入アイテムのリストからリスト内の要素の組み合わせを全て出力する必要があったので方法をメモしておきます。
問題例と解決パターン
例えば
[‘商品A’,’商品B’,’商品C’]
のリストから
[[‘商品A’, ‘商品B’][‘商品A’, ‘商品C’][‘商品B’, ‘商品C’]]
みたいな3C2の組み合わせリストを生成する的な問題です
最初はfor文で愚直に書いていたのですが、処理が激重でライブラリとかないかなーと探していたところところitertoolsという標準ライブラリを使えば簡単に実装できました。
itertoolsでリスト内の全ての組み合わせを取得する
コード例は以下のような感じになります。
data = ['商品A','商品B','商品C'] import itertools for pair in itertools.combinations(data, 2): print(pair)
上を実行すると以下の結果を得られます。
(‘商品A’, ‘商品B’) (‘商品A’, ‘商品C’) (‘商品B’, ‘商品C’)
.combinations(data, 2)の代に引数部分は組み合わせの単位です。
今回は2つの組み合わせを取得したいので2としています
例えば3つの組み合わせを取得したい場合は以下のように記述します
data = ['商品A','商品B','商品C', '商品D'] for pair in itertools.combinations(data, 3): print(pair)
<実行結果>
('商品A', '商品B', '商品C') ('商品A', '商品B', '商品D') ('商品A', '商品C', '商品D') ('商品B', '商品C', '商品D')
このようにitertools.combinations() では、このようにリストの要素で、任意の要素数での全ての組み合わせパターンを(タプルで)得られます。もし全ての長さの組み合わせを取得したい場合は以下のように要素数を1からはじめてリスト長までfor文で回せばよいです。
data = ['商品A','商品B','商品C', '商品D'] for n in range(1,len(data)+1): for conb in itertools.combinations(data, n): print(list(conb))
<実行結果>
(‘商品A’,)
(‘商品B’,)
(‘商品C’,)
(‘商品D’,)
(‘商品A’, ‘商品B’)
(‘商品A’, ‘商品C’)
(‘商品A’, ‘商品D’)
(‘商品B’, ‘商品C’)
(‘商品B’, ‘商品D’)
(‘商品C’, ‘商品D’)
(‘商品A’, ‘商品B’, ‘商品C’)
(‘商品A’, ‘商品B’, ‘商品D’)
(‘商品A’, ‘商品C’, ‘商品D’)
(‘商品B’, ‘商品C’, ‘商品D’)
(‘商品A’, ‘商品B’, ‘商品C’, ‘商品D’)
コメント