0

我想知道如何在 Python 中执行以下操作。如果我有一个带有for循环的函数,则可以使用 if 语句跳过某些数字。

这是从 activestate.com 获得的 fisher-yates d 的实现。

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

现在continue只需转到 d 的下一个值。我怎样才能不做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)

另请注意,维基百科给出了非常相似的 Sattolo 算法的(非递归)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,您只需做一个简单的更改:

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

您可以将参数复制到临时变量。然后使用 temp 变量调用函数并使用 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 回答
0
def function(list):
    for i in (a for a in range(len(list)-1,0,-1) if randint(0,a) > a):
        #do something with list
    #do something else with remainder.

不完全是你要求的。只是想提醒你这种可能性。

于 2013-04-08T12:38:41.687 回答