私はを効率的に見つけたいと思います。値が結ばれたベクトルの順列。私は出力としてその上のすべての[0,0,1,2], [0,0,2,1], [0,1,2,0]
の組み合わせとを取得したいが、私は標準itertools.permutations(perm_vector)
を与えるものです二回[0,0,1,2]
を取得したくない場合は結び付けられた値を持つitertoolsの順列
例えば、。私は次のことをしようとしたが、lenでときperm_vector grows
本当に遅い動作します
:
質問は、実際に、より一般的な「スピードアップ」性質のものです。主な時間は、長いベクトルの順列を作ることに費やされます - 二重性がなくても、12の一意の値からなるベクトルの順列の作成は無限大です。順列データ全体にアクセスせずに束の上で作業することなくitertoolsを繰り返し呼び出す可能性はありますか? perm_vectorが小さい場合
from collections import Counter
def starter(l):
cnt = Counter(l)
res = [None] * len(l)
return worker(cnt, res, len(l) - 1)
def worker(cnt, res, n):
if n < 0:
yield tuple(res)
else:
for k in cnt.keys():
if cnt[k] != 0:
cnt[k] = cnt[k] - 1
res[n] = k
for r in worker(cnt, res, n - 1):
yield r
cnt[k] = cnt[k] + 1
[なぜPythonのitertools.permutationsは重複を含まないのが重複する可能性? (元のリストに重複がある場合)](http://stackoverflow.com/questions/6534430/why-does-pythons-itertools-permutations-contain-duplicates-when-the-original) –
ここに外部[リンク]( http://blog.bjrn.se/2008/04/lexicographic-permutations-using.html)を参考にすることができます。 – Praveen
これはitertoolsモジュールのレシピがありますので、unique_everseenレシピを確認してください:https://docs.python.org/3/library/itertools.html#itertools-recipes – Copperfield