В Python выбрать слева элемент, ближайший по значению?

У меня два списка: малый на 10 элементов и большой на 20. Часть элементов совпадает (через один).

введите сюда описание изображения

Теперь задача выбирать точки в левом, малом, списке. Причем так:

  1. если значения элементов совпадают - берем из малого списка элементы от совпадающего значения вниз (размер окна order задается пользователем, например, 3).
  2. если при сравнении значения 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 
→ Ссылка