2016-01-11 7 views
6

私はを効率的に見つけたいと思います。値が結ばれたベクトルの順列。私は出力としてその上のすべての[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 
+4

[なぜPythonのitertools.permutationsは重複を含まないのが重複する可能性? (元のリストに重複がある場合)](http://stackoverflow.com/questions/6534430/why-does-pythons-itertools-permutations-contain-duplicates-when-the-original) –

+0

ここに外部[リンク]( http://blog.bjrn.se/2008/04/lexicographic-permutations-using.html)を参考にすることができます。 – Praveen

+3

これはitertoolsモジュールのレシピがありますので、unique_everseenレシピを確認してください:https://docs.python.org/3/library/itertools.html#itertools-recipes – Copperfield

答えて

0

perm_vectorが大きい場合は、バックトラックしようとする場合がありますが:

def permu(L, left, right, cache): 
    for i in range(left, right): 
     L[left], L[i] = L[i], L[left] 
     L_tuple = tuple(L) 
     if L_tuple not in cache:     
      permu(L, left + 1, right, cache) 
      L[left], L[i] = L[i], L[left] 
      cache[L_tuple] = 0 
cache = {} 
permu(perm_vector, 0, len(perm_vector), cache) 
cache.keys() 
1

これを試してみてください:

import itertools as iter 
{x for x in iter.permutations(perm_vector)} 

今では、デフォルトで重複を削除セット、なるためには、あなたのユニークな値を与える必要があり、これについてどのように

+0

これは技術的には機能しますが、フィルタリングする前にすべての重複順列が生成されるため、重複が多い場合は非常に効率が悪いです。 – user2357112

+0

@ user2357112それは本当です..もしリストが大きければ、より効率的にするためにバックトラックとメモを使う必要があります。私は上記のコードを投稿しました( "forループ"内で "if"を避ける方法があれば素晴らしいでしょう).. – Rose

関連する問題