Одна проблема:
del intervals[j]
Изменение контейнера во время итерации по нему, как правило, плохая идея. Это часто приводит к пропуску или дублированию значений.
Рассмотрим внутренний l oop, когда i=0
и j=1
:
i=0 j=1
[[1,3],[2,6],[8,10],[15,18]]
Интервалы перекрываются, поэтому выполняется блок if:
intervals[i] = [intervals[i][0],max(intervals[i][1],intervals[j][1])]
, в результате получается:
i=0 j=1
[[1,6],[2,6],[8,10],[15,18]]
затем
del intervals[j]
в результате:
i=0 j=1
[[1,6],[8,10],[15,18]]
затем:
i = i + 1
в результате:
i=j=1
[[1,6],[8,10],[15,18]]
Но теперь for-l oop увеличивает j
:
i=1 j=2
[[1,6],[8,10],[15,18]]
Обратите внимание, как j
пропускает интервал [8,10]
?
Лучше создать новый список интервалов слияния. Если вам необходимо сделать это на месте, работайте в обратном направлении от конца списка. Таким образом, любые измененные индексы будут уже обработанными.