2014-03-26 2 views
2

하나의 이벤트에서 얼마나 많은 "일"이 경과 하는지를 계산할 수있는 알고리즘을 개발해야합니다 (목록에 저장된 참/거짓 목록에있는 Vec1). 다른 이벤트 (목록에 저장된 실제 통화/거짓 통화) Vec2). 다음과 같이 두 개의 목록은 다음과 같습니다두 이벤트 사이에 얼마나 많은 obs가 있는지 계산하는 알고리즘

Vec1 = [True, False, False, False, False, True, True, True, False, True, True, True, False, True, False, True, False, False, False, True] 
Vec2 = [True, False, False, True, True, True, False, True, False, True, True, True, False, True, True, True, True, False, False, True] 

이 더 나은 설명을 얻기 위해,의는 Vec1가 응답되어 가정 해 봅시다 "요한은 오늘 커피를 마시나요?" Vec2은 "Paul이 오늘 커피를 마셨습니까?"라고 대답합니다. 그래서,이 지표로 얻으려고하는 것은 "John drinks"이벤트와 "Paul drinks"이벤트 사이를 지나가는 일수입니다. 논리는 다음과 같이 구성 될 수 있습니다 :

1) 첫 번째 벡터에 "True"값을 찾고 그 날부터 계산을 시작합니다. 2) 두 번째 벡터에 "참"이 표시 될 때까지 카운트를 계속하십시오. 그 순간부터 카운터를 리셋하십시오.

외에도 지금 알고리즘의 끔찍한 구조
trueVector1 = 0 
trueVector2 = 0 
countAct = False 
Count = 0 

while len(ValueInd) < len(Vec1): 
    while Vec1[trueVector1] == False: 
     ValueInd.append(Count) 
     trueVector1 += 1 
    countAct = True 
    trueVector2 = trueVector1 
    while countAct == True: 
     if Vec2[trueVector2] == True: 
      countAct = False 
      ValueInd.append(Count) 
      Count = 0 
      trueVector1 = trueVector2 + 1 
     else: 
      ValueInd.append(Count) 
      trueVector2 += 1 
      Count += 1 

(즉, I : 내가 지금까지를 구축 할 수 있었다

ValueInd = [] 

:

결과의 빈 목록을 채우기 나중에 수정 될 것입니다.) 나는이 해결책이 작동하지 않는 적절한 해결책을 얻을 수 없다. 적절한 출력하는 동안, 내가 위에서 제공 한 자료에 따르면해야한다 :

ValueInd = [0,0,0,0,0,0,0,1,1,2,1,1,0,1,2,1,0,0,0,0] 

내가 실제로 얻을 출력 :

ValueInd = [0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0] 

누군가가 나를 도와 드릴까요? 더 자세한 설명이 필요한지 물어보십시오.

존은 15 일 캘린더에서 0, 4, 5, 8, 10 일에 커피를 마신다. 폴 (Paul)은 2 일, 4 일, 7 일, 8 일, 11 일에 15 일간 커피를 마 십니다. occurrencies 벡터는 따라서 다음과 같습니다

John = [T, F, F, F, T, T, F, F, T, F, T, F, F, F, F, F] 
Paul = [F, F, T, F, T, F, F, T, T, F, F, T, F, F, F, F] 

이 예제의 결과 벡터가 될 것입니다 :

Days = [0, 1, 2, 0, 0, 0, 1, 2, 0, 0, 0, 1, 0, 0, 0, 0] 

이 때문에 : 0) 존 음료와 바울이 카운트가 0으로 시작하지 않도록 ; 1) 아무도 커피를 마시지 않으므로 카운트가 1로 증가합니다. 2) Paul은 음료를 마 십니다. 따라서 카운트가 2로 증가한 다음 꺼집니다. 3) 카운트가 활성화되지 않습니다. 4) 둘 다 음료이므로 같은 날 카운트가 0으로 시작하고 끝납니다. 5) John은 음료를 마시 며, Paul은 그렇게하지 않습니다. 따라서 카운트가 활성화되고 0으로 시작됩니다. 6) 폴 마시없는 하루 -> 카운트 = 1 7) 폴 음료수 -> 카운트 = 2 및 0으로 재설정 8) 둘 다 마시므로 카운트가 0에서 시작하여 같은 날 끝납니다. 9) 그래서 카운트는 0으로 시작합니다. 10) 폴 음료가 있으므로 카운트는 1로 끝납니다. 11 - 15) 아무도 마셔서 카운트가 항상 0이됩니다.

+2

당신의 설명을 이해하기가 다소 어려울 것 같습니다. –

+0

@RaulGuiu, 나는 그것이 나이라고 확신한다;) 나는 질문을 편집하고 예제를 만들려고 노력할 것이다. 그것은 그 자체로 그리 명백하지 않은 개념 + 나의 아주 좋은 설명 기술이 아니다. –

+0

이해하기 어려울뿐만 아니라 설명에서 두 번째 결과가 정확합니다. –

답변

0

다음 작품

def get_counts(Vec1, Vec2): 
    c = 0 
    counts = [] 
    counting = False 
    for v1, v2 in zip(Vec1, Vec2): 
     counts.append(c) 
     if v1: 
      counting = True 
      c = 0 
     if v2: 
      counting = False 
      c = 0 
     if counting: 
      c += 1 

일예

T = True 
F = False 
John = [T, F, F, F, T, T, F, F, T, F, T, F, F, F, F, F] 
Paul = [F, F, T, F, T, F, F, T, T, F, F, T, F, F, F, F] 
get_counts(John, Paul) 

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

예, 작동합니다. 감사! –

+0

실제 프로젝트를 테스트했으며 완벽하게 작동합니다. 덕분에이 문제가 해결되었습니다. 나는 완전성을 위해 뭔가를 지적한다 : if v1 :'블럭에'c = 0'을 놓치고있다. 그렇지 않으면 카운터가 다시 시작되지 않는다. 짧은 명확하고 (특히) 작업 스크립트 주셔서 감사합니다! –

+0

그에 따라 캐치 편집 스 니펫을 보내 주셔서 감사합니다. – jmetz

관련 문제