Поиск двух элементов в списке, которые дают минимальную абсолютную разницу между всеми элементами

Допустим, у меня есть список: 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 метод портит заказ и его трудно отменить. Я упускаю что-то очевидное? Спасибо.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Использовать:

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] выбирает два числа в отсортированном массиве)

Это не работает, потому что вы жестко кодируете позиции индекса. Мне нужно что-то, что может принимать любой список в качестве входных данных и получать правильный результат. Например, это не будет работать со следующим списком: l2=[12,24,36,35,7] вывод должен быть 35 и 36. с вашим кодом это 12 и 24.

Transcending 16.03.2022 17:59

@Transcending Код работает нормально, даже в случае вашего комментария (он вернул [35,36]`). Я добавляю весь код, чтобы сделать его более понятным для вас.

Amirhossein Kiani 16.03.2022 18:02

Извините, опечатка с моей стороны, это сработало. Не могли бы вы объяснить логику?

Transcending 16.03.2022 18:04

@Transcending Конечно, я добавил поясняющую часть к своему ответу в соответствии с вашим комментарием.

Amirhossein Kiani 16.03.2022 18:08

Другие вопросы по теме