2017-03-24 4 views
2

3 가지 조건 (0,1,2)을 사용하여 조건부 실험을 만들고 있으며 조건 순서를 의사 적으로 임의 화해야합니다. 각 조건이 2 회 연속 발생하는 무작위 화 목록이 필요합니다. 여기 어떻게 그것을 달성하려했습니다. 코드가 실행되고 있지만 영원을 필요로합니다 ...반복없이 목록을 의사 랜덤 화합니다. while 루프는 효율적이지 않습니다.

이 코드가 제대로 작동하지 않는 이유와 그 문제를 해결하기위한 다른 방법이 있습니까?

#create a list with 36 values 
types = [0] * 4 + [1] * 18 + [2]*14 #0=CS+ ohne Verstärkung; 1 = CS-, 2=CS+  mit shock 

#random.shuffle(types) 

while '1,1,1' or '2,2,2' or '0,0,0' in types: 
    random.shuffle(types) 
else: print(types) 

감사합니다. 마르티나

+0

정확히 2 회 연속 또는 최대 2 회 연속? – tdelaney

+0

다른 유사한 질문 : http://stackoverflow.com/questions/3313590/check-for-presence-of-a-sliced-list-in-python –

답변

1

루프가 몇 가지 문제가 있습니다. 먼저 while '1,1,1' or '2,2,2' or '0,0,0' in types:while ('1,1,1') or ('2,2,2') or ('0,0,0' in types):과 같습니다. 0이 아닌 문자열은 항상 True이므로 조건은 항상 true이고 while은 결코 멈추지 않습니다. 심지어 그렇다고해도 types은 정수 목록입니다. '0,0,0'은 문자열이며 목록의 요소가 아닙니다.

itertools.groupby은이 문제를 해결하는 좋은 도구입니다. 하위 반복자로 시퀀스를 그룹화하도록 설계된 반복자입니다. 어떤 클러스터가 너무 길어 있는지 확인할 수 있습니다.

import random 
import itertools 

#create a list with 36 values 
types = [0] * 4 + [1] * 18 + [2]*14 # 
print(types) 

while True: 
    random.shuffle(types) 
    # try to find spans that are too long 
    for key, subiter in itertools.groupby(types): 
     if len(list(subiter)) >= 3: 
      break # found one, staty in while 
    else: 
     break # found none, leave while 

print(types) 
+0

정말 멋지다! 내 문제를 완전히 해결했습니다! 전에 itertools 모듈 들어 본 적이 ... 많이 배웠습니다! ;) –

1
while '1,1,1' or '2,2,2' or '0,0,0' in types: 
    random.shuffle(types) 

는 평가로 :

while True or True or '0,0,0' in types: 
    random.shuffle(types) 

및 단락 회로 대신

while True에서 사용 : any() 내부 용어 중 하나가 또한 True

을 경우 True을 반환 , 당신의 타입은 숫자이고 그것을 st와 비교합니다. 반지 :

>>> types 
[0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] 

은 그래서 당신은 비교 될 수있는 문자열로 그 숫자를 매핑해야합니다

>>> ','.join(map(str, types)) 
'0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2' 

시도 :

while any(run in ','.join(map(str, types)) for run in ['0,0,0', '1,1,1', '2,2,2']): 
    random.shuffle(types) 

>>> types 
[1, 2, 1, 2, 1, 2, 1, 1, 0, 2, 0, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 1, 1, 2, 0, 2, 1, 1, 0, 2, 1, 1, 2, 2, 1, 1] 
+0

감사! 그것은 훌륭한 해결책이기도합니다! 전체 파이썬 초보자로서, 나는지도 함수가 무엇을하는지 실제로 이해하지 못한다. 목록 유형의 모든 요소에 "str"을 적용합니까? 그래서 모든 항목을 반복하거나 맵 함수가 다르게 작동합니까? –

+0

@MartinaTakeaway 예, [map()] (https://docs.python.org/2/library/functions.html#map)은 제공된 반복기의 모든 항목에 지정된 함수를 적용합니다. – TemporalWolf