从列表中选择唯一值

Dev*_*oka 1 python random unique python-2.7

我想要做的是,有一个字符列表,每个都是一个过程,然后我想从这个列表中随机选择(或伪随机,无关紧要),并执行该过程,然后我想要能够再次运行它,而不是获得相同的值,例如,如果我有五个值,我希望能够运行它5次,那么第六次运行它,它什么都不返回.这是代码:

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() 
Run Code Online (Sandbox Code Playgroud)

我想要得到

callback()
Run Code Online (Sandbox Code Playgroud)

为了正常运行,我已经尝试了你所看到的,但我也试过了

if Characters[rando] in Used:
    print 'This has already been used'
else: 
   Characters[rando]
   Used.append(Characters[rando])
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,它将多次运行相同的程序,例如,'Leo'可能连续执行3次.我搜索了几个小时的方法来做到这一点,但我找不到一个.

mgi*_*son 7

首先,我要shuffleCharacters:

Characters = [Percy,Annabeth,Leo,Chuck,Sarah]
random.shuffle(Characters)
Run Code Online (Sandbox Code Playgroud)

现在当你运行你的回调时,你会出现pop一个角色:

def callback():
    try:
       C = Characters.pop()  #popping the last one is more efficient than the first.
    except IndexError:
       return None

    return C()
Run Code Online (Sandbox Code Playgroud)

由于这会破坏Characters,您可能需要保留它的副本以重置,如果您需要:

 random.shuffle(Characters)
 Characters_save = Characters[:]

 def reset_characters():
     Characters[:] = Characters_save[:]
Run Code Online (Sandbox Code Playgroud)

  • 你不需要为`.pop()`指定一个索引,只需让它弹出最后一个,因为它是最有效的 (2认同)