困っていること
下記のようなリストがあり、全ての並び替えパターンを抽出したいです。
ソースコードに記載している今の方法では要素が増える度に処理が遅くなり困っています。
元データ
配列には数値型のみが格納されます。
・最大40要素程度を想定しています
・例えば 1070 のような4桁の数値も入り得ます
# シンプルな例 data = [0,0,0,0,0,0,1,1] # 最も要素が多い場合の例 data = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,700,1010,1010]
期待する結果
(1, 0, 0, 0, 1, 0, 0, 0) (0, 0, 0, 0, 1, 0, 1, 0) (0, 0, 0, 0, 0, 0, 1, 1) (0, 0, 0, 0, 0, 1, 1, 0) (1, 0, 0, 0, 0, 0, 1, 0) (0, 1, 0, 0, 0, 1, 0, 0) (0, 0, 0, 0, 1, 0, 0, 1) (0, 0, 1, 0, 0, 1, 0, 0) (0, 1, 0, 0, 1, 0, 0, 0) (0, 0, 0, 0, 0, 1, 0, 1) (1, 0, 0, 0, 0, 0, 0, 1) (0, 0, 0, 1, 0, 1, 0, 0) (0, 0, 1, 0, 1, 0, 0, 0) (1, 0, 0, 1, 0, 0, 0, 0) (0, 0, 0, 1, 1, 0, 0, 0) (1, 0, 1, 0, 0, 0, 0, 0) (0, 1, 0, 0, 0, 0, 1, 0) (1, 1, 0, 0, 0, 0, 0, 0) (0, 0, 1, 0, 0, 0, 1, 0) (0, 0, 0, 1, 0, 0, 1, 0) (0, 1, 0, 0, 0, 0, 0, 1) (0, 1, 0, 1, 0, 0, 0, 0) (0, 0, 1, 0, 0, 0, 0, 1) (0, 0, 0, 0, 1, 1, 0, 0) (0, 0, 1, 1, 0, 0, 0, 0) (0, 1, 1, 0, 0, 0, 0, 0) (0, 0, 0, 1, 0, 0, 0, 1) (1, 0, 0, 0, 0, 1, 0, 0)
今の実装方法
下記の流れで処理していますが、効率が悪い気がしています。
解決策が見つけられず困っています。
他に良い方法(特に速度面で)があればご教授頂きたいです。
1.まずは配列の順列を取得する
2.取得した順列に対してSETを取り、重複を削除する
import itertools as ir data = [0,0,0,0,0,0,1,1] data_len = len(data) print(data_len) # 8要素 permutations = list(ir.permutations(data)) print(len(permutations)) # 40320通り permutations_set = list(set(permutations)) print(len(permutations)) # 28通り for i in permutations_set: print(i)
回答2件
あなたの回答
tips
プレビュー