Посчитать время событий в списке

Есть список кортежей, первый элемент которых - время гола, а второй - обозначение команды. Время матча ограничим 94 минутами.

Как получить 6 значений:

  • Команда H вела в счёте * минут;
  • Команда H и А играли с одинаковым счётом * минут;
  • Команда H проигрывала в счёте * минут;
  • Команда A вела в счёте * минут;
  • Команда H и А играли с одинаковым счётом * минут;
  • Команда A проигрывала в счёте * минут?
goaltimer([(40, H), (51, H), (59, A), (71, A),(85, H), (88, A),(93, H)])
[35,59,0,0,59,35]

Ответы (2 шт):

Автор решения: MBo

Сделайте относительный счёт - разность голов. Пройдите по списку, добавляя +1, если первая команда, или -1, если вторая, и запоминая последнее время.

Если счёт становится из нулевого положительным - начался интервал первого типа. По его окончании добавьте длину интервала к соответствующему значению.

if count == 0 and goaltimer[1] == H:
    times[currenttype] += goaltimer[0] - starttime
    starttime = goaltimer[0] 
    currenttype = 1
    count +=1
elif count == 1 and goaltimer[1] == A:
    times[currenttype] += goaltimer[0] - starttime
    starttime = goaltimer[0] 
    currenttype = 0
    count -=1
...     
     

Так же рассмотрите остальные переходы - в 0, в минус.

→ Ссылка
Автор решения: Alexandr Kosolapov
ff = [(40, 'H'), (51, 'H'), (59, 'A'), (71, 'A'),(85, 'H'), (88, 'A'),(93, 'H')]
def forces(ff):
    ff = ff + [(94,'F')]
    t1 = t2 = t3 = h = a = c = 0
    for f in ff:
        if c == 0:
            start = f[0]
            if f[1] == 'H': h += 1
            if f[1] == 'A': a += 1
            t2 += f[0]
        else:
            temp = f[0] - start
            past = h-a
            if f[1] == 'H': h += 1
            if f[1] == 'A': a += 1
            if f[1] != 'F':
                if past == 0: t2 += temp    
                if (past > 0) and (h>=a): t1 += temp      
                if (past < 0) and (h<=a): t3 += temp
            if f[1] == 'F':
                if past == 0: t2 += temp    
                if (past > 0) and (h>=a): t1 += temp      
                if (past < 0) and (h<=a): t3 += temp
            print(f,h,a,temp,t1,t2,t3)
        start = f[0]
        c+=1
    return [t1,t2,t3]
forces(ff)
→ Ссылка