Найти недостающие элементы в системе координат (массив)
Имею например список(массив) из набора точек с координатами.
[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
Ответы (1 шт):
Ради эксперимента вот вам решение с помощью 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