Найти недостающие элементы в системе координат (массив)

Рейтинг: -1Ответов: 1Опубликовано: 08.03.2023

Имею например список(массив) из набора точек с координатами.

[1,[53.946865249,57.043416178]],[2,[53.947118389,57.043535608]],[3,[53.946607974,57.043553656]],[4,[53.946798082,57.043767565]],[6,[53.946316906,57.044025522]],[8,[53.946048037,57.044154025]],[9,[53.945823274,57.04400278]],[10,[53.94566651,57.044362572]],[11,[53.945625156,57.044096028]],[12,[53.945246109,57.044612473]],[13,[53.945351006,57.044148944]],[14,[53.945053428,57.044775649]],[15,[53.945224546,57.044337295]],[16,[53.944563232,57.045013053]],[17,[53.944955238,57.04450561]],[19,[53.944715477,57.04464065]],[20А,[53.943646,57.045564]],[21,[53.944485343,57.044760069]],[22,[53.943308,57.045731]]

требуется найти недостающие элементы между точками в четной и нечетной последовательности, высчитать недостающие от 1 до последней (в приведенном примере это 22) в списке могут иметь место буквенные, например 20А которые нужно как бы пропускать

вывести на экран пропущенные(координаты приведены примерно)

[5,[53.946356,57.043710]],[7,[53.946091,57.043846]],[18,[53.944069,57.045272]],[20,[53.946798082,57.043767565]]

высчитать между двумя координатами могу и на этом все тупик.

x1,y1 = 55.568933911,38.009693681
x2,y2 = 55.568369692,38.009092897
print((x1 + x2)/2, (y1 + y2)/2)

найти недостающий как бы тоже

const arr = [1,2,3,5,6,7,8,9];
return arr.find((x,i) => arr[i+1]-x > 1) + 1
//4

Ответы

▲ 0Принят

Ради эксперимента вот вам решение с помощью pandas. Только имейте в виду, что исходный список должен быть подготовлен (ваше "20A" у меня - явный строковый литерал). В противном случае нужно будет еще обрабатывать исходные данные:

import pandas as pd

a = ([1,[53.946865249,57.043416178]],[2,[53.947118389,57.043535608]],[3,[53.946607974,57.043553656]],
     [4,[53.946798082,57.043767565]],[6,[53.946316906,57.044025522]],[8,[53.946048037,57.044154025]],
     [9,[53.945823274,57.04400278]],[10,[53.94566651,57.044362572]],[11,[53.945625156,57.044096028]],
     [12,[53.945246109,57.044612473]],[13,[53.945351006,57.044148944]],[14,[53.945053428,57.044775649]],
     [15,[53.945224546,57.044337295]],[16,[53.944563232,57.045013053]],[17,[53.944955238,57.04450561]],
     [19,[53.944715477,57.04464065]],["20A",[53.943646,57.045564]],[21,[53.944485343,57.044760069]],
     [22,[53.943308,57.045731]])
df = pd.DataFrame([x for x in a if type(x[0])==int]).set_index(0)
df[["x", "y"]] = pd.DataFrame(df[1].tolist(), index=df.index)
df = df.drop(columns=1)
new_idx = range(df.index.min(), df.index.max()+1)
missed_idx = [x for x in new_idx if x not in df.index]
df = df.reindex(new_idx)
res = df.interpolate(method='linear', limit_direction='forward', axis=0)
missed = res.loc[missed_idx]
print(missed)

результат:

            x          y
0                       
5   53.946557  57.043897
7   53.946182  57.044090
18  53.944835  57.044573
20  53.944600  57.044700

UPDATE

я не совсем понял про чёт-нечет, но если нужно интерполировать четные от четных, а нечетные от нечетных, то можно сделать так (после df.reindex(new_index):

df.iloc[::2] = df.iloc[::2].interpolate(method='linear', limit_direction='forward', axis=0)
df.iloc[1::2] = df.iloc[1::2].interpolate(method='linear', limit_direction='forward', axis=0)
missed = df.loc[missed_idx]
print(missed)

получим:

            x          y
0                       
5   53.946346  57.043703
7   53.946085  57.043853
18  53.944145  57.045252
20  53.943726  57.045492