2017-01-23 8 views
-1

配列の可能なすべての順列に対して関数を作成したいと思います。私はいくつかのコードを書いたが、何が間違っているのか分からない。それは私に最初の可能性= [1,2,3]を返しますが、それはエラーで失敗します:元の[i]インデックス外ですが、元の[1]でなければなりません2です。私には意味をなさない。Pythonでの順列 - テンプレート

アドバンテージありがとうございます。

array = [1,2,3] 
out = [] 

def permutacja(original,perm): 
    if(len(original) == 0): 
     print(perm) 
     return perm 

    temp = original 
    for i in range(0,len(original)): 
     perm.append(original[i]) 
     del temp[0] 
     permutacja(temp,perm) 
     del perm[len(perm)-1] 

permutacja(array,out) 
+0

うんを、一時は元 からも消去されます 'tmpに=配列は、あなたが使用する必要があります insdeadをlist'への参照を#copies: 'tmp = list(array)' –

答えて

4

Pythonの標準ライブラリモジュールitertoolsは、順列を生成するitertools.permutationsを提供:

>>> import itertools 
>>> for xs in itertools.permutations([1,2,3]): 
...  print(xs) 
... 
(1, 2, 3) 
(1, 3, 2) 
(2, 1, 3) 
(2, 3, 1) 
(3, 1, 2) 
(3, 2, 1) 
+0

ありがとうございます。しかし、これは私のアルゴリズムにこれを当てはめるための簡単な方法を理解する必要があるより複雑なアルゴリズムのためにこれを必要としています – user3541098

+1

@ user3541098、 、私はあなたにあなたのimpについてのヒントを与えるでしょう緩和の問題。 'temp = original'を実行することによって、' temp'は同じリストを参照します(コピーしません)。 'temp = original [:]'を実行すると、コピーが得られます。 – falsetru

+0

@ user3541098: 'itertools'は、文字列、ints、浮動小数点、オブジェクトなどのすべての種類のデータで動作します。 –

0

これらがうまく最適化され、テストルーチンですので、あなたがよりよいこのためitertoolsを使用しています。それでもあなたはそれを自分で実装したい場合には、修正/改善することができることがいくつかあります。

  • あなたreturnは値が、唯一のあなたはに必要な最後の再帰的ステップに戻ってそれらを伝播します。
  • 参照をオンザフライで作成したリストに戻すと、結果として常に同じリストが返されます。
  • あなたはいつもdelです。最初の要素、あなたが選んだものではありません。そして
  • あなたはを復元しません。削除後の要素。
def permutacja(original,perm): 
    if(len(original) == 0): 
     print(perm) 
     yield perm.copy() # emit instead of return for proagation 
    else: 
     temp = original 
     for i in range(0,len(original)): 
      perm.append(original[i]) 
      temp = original[:i]+original[i+1:] #remove the i-th 
      for result in permutacja(temp,perm): 
       yield result # propagate back 
      del perm[len(perm)-1] 
      # because we copy original, no need to restore 

いくつかのadditonalの改良:最後の要素に

  • 使用.pop()の代わりdel。そして
  • は、あなたは、単にlen(..)に比較するのではなく、if originalを使用することができます。
def permutacja(original,perm): 
    if original: 
     print(perm) 
     yield perm.copy() 
    else: 
     temp = original 
     for i in range(0,len(original)): 
      perm.append(original[i]) 
      temp = original[:i]+original[i+1:] #remove the i-th 
      for result in permutacja(temp,perm): 
       yield result # propagate back 
      perm.pop() 
      # because we copy original, no need to restore 
関連する問題