我想要做的是,有一个字符列表,每个都是一个过程,然后我想从这个列表中随机选择(或伪随机,无关紧要),并执行该过程,然后我希望能够再次运行它,而不是获得相同的值,例如,如果我有五个值,我希望能够运行它5次,那么第6次运行它,它什么都不返回。这是代码:
from Tkinter import*
from random import randint
Characters=[Percy,Annabeth,Leo,Chuck,Sarah]
Used = []
def callback():
end = len(Characters)-1
rando = randint(0,end)
Characters[rando]
for i in Characters:
if Characters[rando] in Used:
print 'This has already been used'
else:
Characters[rando]()
Used.append(Characters[rando])
break
game = Tk()
game.geometry('50x50+700+100')
Button1 = Button(game,text = '1',command =lambda:callback() )
Button1.pack(side=LEFT)
game.mainloop()
我想要
callback()
要正常运行,我已经尝试了你所看到的但我也尝试了
if Characters[rando] in Used:
print 'This has already been used'
else:
Characters[rando]
Used.append(Characters[rando])
在这两种情况下,它将多次运行相同的程序,例如,'Leo'可能连续执行3次。我搜索了几个小时的方法,但我找不到一个。
答案 0 :(得分:7)
首先,我会shuffle
Characters
:
Characters = [Percy,Annabeth,Leo,Chuck,Sarah]
random.shuffle(Characters)
现在当你运行回调时,你pop
有一个角色:
def callback():
try:
C = Characters.pop() #popping the last one is more efficient than the first.
except IndexError:
return None
return C()
由于这会破坏Characters
,如果您需要,可能需要保留其副本以重置:
random.shuffle(Characters)
Characters_save = Characters[:]
def reset_characters():
Characters[:] = Characters_save[:]
答案 1 :(得分:0)
完全未经测试 - 但您可以实现基本类:
from random import shuffle
class CallNext(object):
def __init__(self, vals):
self.vals = vals[:]
shuffle(self.vals)
self.iter = iter(self.vals)
def __call__(self):
try:
next(self.iter)()
except StopIteration as e:
pass # or do something smarter?
另一种选择,而不是捕捉StopIteration
将是使用:
next(self.iter, lambda: None)()
然后:
Button1 = Button(game, text='1', command=CallNext(Characters) )