2012-10-22 2 views
1

내가하려는 것은 프로 시저 인 각각의 문자 목록을 가지고 다음이 목록에서 무작위로 (또는 임의로, 무작위로, 중요하지 않음) 그 프로 시저를 실행하면, 다시 그것을 실행할 수 있고 동일한 값을 얻지 못하게하려고합니다. 예를 들어 5 개의 값을 가지고 있다면 5 번, 5 번, 6 번 실행하고 싶습니다. 아무것도 반환하지 않습니다. 여기에 코드입니다 : 내가목록에서 유일한 값 선택

callback() 

제대로 실행하려고 노력하고

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() 

, 나는 당신이 무엇을보고 시도했지만 나는 또한 두 경우 모두

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

을 시도 그것 동일한 절차를 여러 번 실행합니다. 예를 들어 'Leo'가 연속으로 3 번 실행될 수 있습니다. 이 작업을 수행하는 데 수 시간 동안 수색을했으나 찾을 수 없었습니다. 당신이 당신의 콜백을 실행할 때 pop 하나 개의 문자 아웃, 이제

Characters = [Percy,Annabeth,Leo,Chuck,Sarah] 
random.shuffle(Characters) 

:이 Characters을 파괴하기 때문에

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

    return C() 

, 당신은 계속 할 수 있습니다

+0

이있다 여기에 잘 답변되었습니다 : http://stackoverflow.com/questions/3791400/how-can-you-select-a-random-element-from-a-list-and-have-it-be-removed – minism

답변

7

첫째, 나는 Charactersshuffle 것 다음과 같이 재설정해야 할 경우 재설정 할 사본 :

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

def reset_characters(): 
    Characters[:] = Characters_save[:] 
+2

당신은 ' 필요 없다 '.pop()'에 대한 인덱스를 지정하려면, 마지막으로 가장 효율적으로 표현하자. –

+0

@JonClements - 효율을 위해'.pop (-1) '로 변경했지만, 맞다. 여기서 지정할 필요가 없습니다. 업데이트 됨. – mgilson

+0

'shuffle'도 내부에 있으므로'None'을 반환하고 * before * shuffling을 저장해야합니다 ... –

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)) 
관련 문제