而不是继续,重新运行功能

时间:2013-04-08 12:25:54

标签: python for-loop

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

这是来自activestate.com的渔民的实施。

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 个答案:

答案 0 :(得分: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)

另请注意Wikipedia gives a (non-recursive) python implementation of the very similar Sattolo's algorithm.

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

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分: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.

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

相关问题