2016-10-11 1 views
3

각 루프마다 임의의 값을 생성하고 이전 루프 중 하나에서 이전에 해당 번호가 생성되었는지 확인하는 동안 변수 minimum에 저장하려고합니다.임의의 값이 이전 루프에서 존재하는지 확인

listQ은 기본적으로 파일에서 임의로 선택한 6 행을 포함합니다. 라인은 1 ~ max_line (기본적으로 6 단계가 max_line 값보다 작음) 중에서 선택되었습니다. 따라서 6의 배수가되는 숫자를 생성해야합니다.

for x in range(0, 10): 
    minimum = random.randrange(0, max_line,6) 
    maximum = minimum+6 
    listQ = listQ[minimum:maximum] 

비트가 여기에 걸렸습니다. 아마도 목록일까요?

+2

물론 목록에 추가하고''number in list''로 확인할 수 있습니다. 대량의 데이터의 경우'''set()'''이 더 낫습니다. 물론이 보조 데이터 구조는 루프 외부에서 정의됩니다! – sascha

+0

논리가 잘못되었습니다. randrange는 0을 최소값으로 반환 할 수 있으므로 최대 값은 최소 6이되므로 최대 값을 최소값으로 설정하는 것은 의미가 없습니다. – ozgur

+0

0과 6은 목록에서 첫 번째 값이 없으므로 아무런 문제가 없습니다. – user3431336

답변

1

모든 이전 값의 목록을 유지하고 이후의 각 반복을 확인하십시오.

# sets have faster "val in set?" checks than lists 
# do this once, somewhere in your program 
previous_vals = set() 

# other stuff here, including main program loop 
for x in range(0, 10): 
    # find a unique, new random number while 
    # limiting number of tries to prevent infinite looping 
    number_of_tries = 0 
    MAX_TRIES = 10 
    generating_random = true 
    while generating_random:  
     minimum = random.randrange(0, max_line,6) 
     if minimum not in previous_vals: 
      previous_vals.add(minimum) 
      generating_random = false 
     number_of_tries += 1 
     if number_of_tries == MAX_TRIES: 
      raise RunTimeError("Maximum number of random tries reached!") 

    maximum = minimum+6 
    listQ = listQ[minimum:maximum] 

예를 수정하려는 경우 there are other functions for set than add에 유의하십시오.

무한 루프에서 코드가 멈추지 않도록 최대 시도 횟수를 추가했습니다. 입력 데이터에 대해 알지 못해이 상황에 쉽게 접근 할 수 있는지 알 수 없으므로.

+0

감사합니다. 이것은 정말 도움이되었습니다! 그런데 – user3431336

+0

파일을 한 번만 열도록 구조화하는 것이 가능합니까? 그것은 심지어 가능'open' ----- 경우와 '응답 [0] =='m ' 연 상태 ('후 Question.txt ')로서 F : max_line = LEN (F. readlines()) open ('questions.txt')을 f로 사용 : allQ = [line inf() for f]' – user3431336

관련 문제