Вот мой новый ответ. Функция get time делает несколько вещей: 1, вычисляя время: Functon создает локальный список с именем times
и добавляет к нему значения времени (как в предыдущем ответе, но на этот раз мы используем локальный список, поэтому он неЭто не занимает много памяти), учитывая все previous_intervals
и интервалы, передаваемые функции. Затем он экономит время воспроизведения до переменной с именем time_played
. Это то, что будет возвращено позже. 2, вычисляя previous_intervals
- переменная previous_intervals
очищается тогда, если число раз больше 0 (чтобы избежать pop(0)
повышения IndexError
, если нет, то previous_intervals
в любом случае пустые)Программа отсортирует время и выяснит все интервалы, необходимые для создания списка времени, которое там есть. Затем он сохранит значение в previous_intervals
для следующего запуска функции 3, возвращая - программа вернет переменную time_played
, которую мы создали ранее. Он не возвращает len(times)
, так как с тех пор, как мы выделили предмет, это будет неправильно в большинстве случаев;однако, это не будет неправильным, если не прошло ни одной секунды (т. е. пройденный интервал был [0, 0]
), поэтому мы также не можем вернуть len(times) + 1
.
Особая благодарность Диармуиду О'Брайну, который ответил на Пары из единого списка , помог мне написать previous_intervals
расчет
previous_intervals = []
def get_time(*intervals):
global previous_intervals
times = []
intervals = list(intervals) + previous_intervals
for interval in intervals:
for time in range(interval[0], interval[1]):
if time not in times:
times.append(time)
time_played = len(times)
previous_intervals = []
if len(times) > 0:
times.sort()
lastTime = times.pop(0)
important_intervals = [lastTime]
for time in times:
if time != lastTime + 1:
important_intervals.append(lastTime + 1)
important_intervals.append(time)
lastTime = time
important_intervals.append(lastTime + 1)
while(important_intervals):
start_time = important_intervals.pop(0)
end_time = important_intervals.pop(0)
previous_intervals.append([start_time,end_time])
return time_played
print(get_time([0, 0]))
#time_played = 0s, not 1s as would happen if we returned len(times) with correction for the missing values
print(get_time([0, 0], [1, 1]))
#time_played = 0s, we can now pass multiple intervals. ([0, 0] = No time passed + [1, 1] = No time passed, so even though this may look odd it's totally correct)
print(get_time([0, 10]))
#time_played = 10s
print(get_time([8, 14]))
#time_played = 14s because [0,10]+[8,14] -> [0,14] is the effective time interval
print(get_time([2, 3]))
#time_played = 14s because this time interval has already been covered
print(get_time([20, 25]))
#time_played = 19s because [0, 14] + [20, 25] makes 19s the video was effectively played
## Expected output:
## 0
## 0
## 10
## 14
## 14
## 19
Надеюсь, это полезно helpful