0

Pythonで次のことを行う方法を知りたいです。forループを含む関数がある場合、if ステートメントを使用して特定の数値をスキップすることができます。

これは、activestate.com から入手した fisher-yates の実装です。

import random

def shuffle(ary):
    a=len(ary)
    b=a-1
    for d in range(b,0,-1):
      e=random.randint(0,d)
      if e == d:
            continue
      ary[d],ary[e]=ary[e],ary[d]
    return ary

dcontinueの次の値に進むだけです。continueを実行する代わりに、元のパラメーターを使用して関数を再実行するにはどうすればよいaryですか?

関数は単なるサンプル コードであることに注意してください。これを一般的に行う方法に興味があります。また、リストが大きい場合、配列のコピーを維持できない可能性があるため、これは実際には解決策ではありません。

4

4 に答える 4

2

これは一般的な再帰パターンです。ただし、シャッフルが失敗した場合に再帰するときに使用する入力リストのコピーを作成する必要があるため、ケースは通常とは少し異なります。

import random

def shuffle(ary):
    initial = ary[:]
    a=len(ary)
    b=a-1
    for d in range(b,0,-1):
      e=random.randint(0,d)
      if e == d:
            return shuffle(initial)
      ary[d],ary[e]=ary[e],ary[d]
    return ary


ary = [1,2,3,4,5,6]
print shuffle(ary)

また、ウィキペディアでは、非常によく似たサットロのアルゴリズムの (非再帰的な) python 実装が提供されていることにも注意してください。

from random import randrange

def sattoloCycle(items):
    i = len(items)
    while i > 1:
        i = i - 1
        j = randrange(i)  # 0 <= j <= i-1
        items[j], items[i] = items[i], items[j]
    return

記事を正しく読んだ場合、Fisher-Yates を再取得するには、1 つの簡単な変更を行うだけです。

from random import randrange

def FisherYates(items):
    i = len(items)
    while i > 1:
        i = i - 1
        j = randrange(i+1)  # 0 <= j <= i
        items[j], items[i] = items[i], items[j]
    return
于 2013-04-08T12:32:46.020 に答える
0
def function(list):
    len(list)-1
    for i in range(len(list)-1,0,-1):
      e= randint(0,i)
      while e > i:
            e= randint(0,i)
      "do something to the list"
    return array

?

于 2013-04-08T12:32:27.000 に答える
0

パラメータを一時変数にコピーできます。次に、一時変数を使用して関数を呼び出し、return を使用します。

def function(list):
listCopy = list;
    len(list)-1
    for i in range(len(list)-1,0,-1):
      e= randint(0,i)
      if e > i:
            return function(listCopy)
      else
            "do something with the list"
    return array
于 2013-04-08T12:34:29.590 に答える