我想知道如何在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
?
请注意,该函数只是一些示例代码,我很好奇如何执行此操作。 此外,如果列表很大,可能无法维护数组的副本,因此这不是真正的解决方案。
答案 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.
不完全是你要求的。只是想提醒你这种可能性。