Один из возможных подходов:
Форматировать все элементы серии в
кортежи (x, y, идентификатор серии), например, (4,
150, 1), добавить их в список кортежей и отсортировать по возрастанию.
Объявите список с длиной, равной количеству серий, чтобы сохранить значение «последний раз видел» для каждой серии.
Итерация по каждому кортежу элементов списка на шаге (1) и:
3.1 Обновить список «последних посещений» в соответствии с идентификатором серии в кортеже
3.2 Если x предыдущего итерированного кортежа не совпадает с x текущего кортежа, суммируйте все элементы списка «последних увиденных» и добавьте результат в окончательный список.
Теперь с моим грязным тестом:
>>>
S1 = ((1, 100), (5, 100), (10, 100))
S2 = ((4, 150), (5, 100), (18, 150))
>>> all = []
>>> for s in S1: all.append((s[0], s[1], 0))
...
>>> for s in S2: all.appned((s[0], s[1], 1))
...
>>> all
[(1, 100, 0), (5, 100, 0), (10, 100, 0), (4, 150, 1), (5, 100, 1), (18, 150, 1)]
>>> all.sort()
>>> all
[(1, 100, 0), (4, 150, 1), (5, 100, 0), (5, 100, 1), (10, 100, 0), (18, 150, 1)]
>>> last_val = [0]*2
>>> last_x = all[0][0]
>>> final = []
>>> for e in all:
... if e[0] != last_x:
... final.append((last_x, sum(last_val)))
... last_val[e[2]] = e[1]
... last_x = e[0]
...
>>> final.append((last_x, sum(last_val)))
>>> final
[(1, 100), (4, 250), (5, 200), (10, 200), (18, 250)]
>>>