Предполагая, что ваши входные кортежи отсортированы, как в примерах, что-то вроде этого делает работу:
p = [(4, 8), (6, 10), (11, 12), (15, 20), (20, 25)]
ind = np.where(np.diff(np.array(p).flatten()) <= 0)[0]
np.delete(p, [ind, ind+1]).reshape(-1, 2)
output:
array([[ 4, 10],
[11, 12],
[15, 25]])
Затем вы можете преобразовать его в [(4, 10), (11, 12), (15, 25)]
используя, например, list(map(tuple, ...))
.
Редактировать : вышеприведенное работает, только если каждый кортеж (x_i, y_i)
таков, что x_i <= x_{i+1}
и y_i <= y_{i+1}
для всех я, как висходные примеры.
Чтобы заставить его работать с единственным условием x_i <= y_i
для всех i
, необходимо предварительно обработать список:
# Example from comments (modified by subtracting the min value and removing duplicates)
p = [(0, 90), (72, 81), (87, 108), (459, 606)]
p = list(zip(sorted([tup[0] for tup in p]), sorted([tup[1] for tup in p])))
ind = np.where(np.diff(np.array(p).flatten()) <= 0)[0]
ind = ind[ind % 2 == 1] # this is needed for cases when x_i = y_i
np.delete(p, [ind, ind+1]).reshape(-1, 2)
Вывод:
array([[ 0, 108],
[459, 606]])