В Python выбрать слева элемент, ближайший по значению?
У меня два списка: малый на 10 элементов и большой на 20. Часть элементов совпадает (через один).
Теперь задача выбирать точки в левом, малом, списке. Причем так:
- если значения элементов совпадают - берем из малого списка элементы от совпадающего значения вниз (размер окна
orderзадается пользователем, например, 3). - если при сравнении значения
x_iиx_jне совпадают, то из ряда значенийx_iвыбираем ближайшее кx_jслева (в нашем случае - сверху) значениеx_iи уже от него отсчитываем вниз заданное окно.
например, для значения x_j = 0.157 ближайшее слева значение x_i = 0; аналогично: для значения x_j = 0.471 ближайшее слева значение x_i = 0.314
Как мне выбрать элемент в инструкции else?
Код:
x_i_list = [(0.1*np.pi*i) for i in range(0, 11)]
x_j_list = [(0.05*np.pi*j) for j in range(0, 21)]
order = 3
for point_elem_j in x_j_list:
for point_elem_i in x_i_list:
# если значения совпадают:
if x_j_list[point_elem_j] == x_i_list[point_elem_i]:
x_0 = x_i_list[point_elem_i]
else:
# если значения не совпадают: как выбрать ближайшее слева в ряду x_i?
...
# задаем правую границу окна, исходя из величины order:
x_elem_index = x_i_list[point_elem_i+order-1]
Ответы (1 шт):
Автор решения: MBo
→ Ссылка
Ну вот смотрите - у вас два ряда точек последовательно лежат вдоль оси, многие точки совпадают. Нужно двигаться по обоим одновременно с помощью двух индексов. Какой элемент меньше - тот индекс увеличивать. Так получается линейное время.
ia = 0
ib = 0
while ia < a_len and ib < b_len:
if a[ia] < b[ib]:
делаем что-то
ia += 1
elif a[ia] > b[ib]:
делаем что-то другое
ib += 1
else:
делаем третье для случая равенства
ia += 1
ib += 1
# в одном из списков могут остаться необработанные элементы
while ia < a_len:
делаем что-то с остатком а
ia +=1
while ib < b_len:
делаем что-то с остатком b
ib +=1
