Допустим, у меня есть список: l=[7,2,20,9]
, и я не хочу находить минимальную абсолютную разницу между всеми элементами внутри (в этом случае это будет 9-7 = 2 или эквивалентно |7-9|). Чтобы сделать это в сложности nlogn, мне нужно выполнить сортировку, взять разницу и найти минимальный элемент:
import numpy as np
sorted_l = sorted(l) # sort list
diff_sorted = abs(np.diff(sorted_l)) # get absolute value differences
min_diff = min(diff_sorted) # get min element
Однако после этого мне нужно отследить, какие элементы использовались в исходном списке l
, что привело к этой разнице. Таким образом, для l
минимальная разница составляет 2, а мне нужно вывести 7 и 9, поскольку 9-7 равно 2. Есть ли способ сделать это? sorted
метод портит заказ и его трудно отменить. Я упускаю что-то очевидное? Спасибо.
Использовать:
index = diff_sorted.tolist().index(min_diff)
sorted_l[index:index+2]
[7, 9]
import numpy as np
l=[12,24,36,35,7]
sorted_l = sorted(l)
diff_sorted = np.diff(sorted_l)
min_diff = min(diff_sorted)
index = diff_sorted.tolist().index(min_diff)
sorted_l[index:index+2]
[35, 36]
tolist
преобразует массив numpy в список, функции которого содержат index
, который дает вам индекс входного аргумента. Поэтому с помощью функций tolist
и index
получаем индекс минимума в отсортированном массиве. Используя этот индекс, мы получаем два числа, которые привели к минимальной разнице ([index:index+2] выбирает два числа в отсортированном массиве)
@Transcending Код работает нормально, даже в случае вашего комментария (он вернул [35,36]`). Я добавляю весь код, чтобы сделать его более понятным для вас.
Извините, опечатка с моей стороны, это сработало. Не могли бы вы объяснить логику?
@Transcending Конечно, я добавил поясняющую часть к своему ответу в соответствии с вашим комментарием.
Это не работает, потому что вы жестко кодируете позиции индекса. Мне нужно что-то, что может принимать любой список в качестве входных данных и получать правильный результат. Например, это не будет работать со следующим списком:
l2=[12,24,36,35,7]
вывод должен быть 35 и 36. с вашим кодом это 12 и 24.