Мне дан список целых чисел/поплавков, и мне нужно найти два числа, наиболее близкие друг другу. Как я могу это сделать, используя только вложенные для циклов?Две самые близкие точки в списке?
ответ
Для каждого элемента вам необходимо сравнить его расстояние с каждым другим элементом с вашим предыдущим «самым близким» значением - в любое время, когда это сравнение дает меньшие значения, вы помните, что эта пара является «двумя ближайшими».
Таким образом, это просто:
def find_two_closest(numbers):
# most distant points:
delta = max(numbers), min(numbers)
for i, element in enumerate(numbers):
for j, sec_element in enumerate(numbers):
if i == j:
continue
if abs(sec_element - element) < abs(delta[0] - delta[1]):
delta = sec_element, element
return delta
спасибо! это именно то, что я искал! – PythonSOS
Не то, чтобы это «тупая» вещь O (N²) - так, около 1000 чисел, вы делаете 1000000 comaprisons, что может быть хорошо для вашей цели. Если вам нужны более разумные способы, алгоритм, который разбивает ваш список в кластерах, сгруппированных по взаимной близости, и только сравнить элементы внутри каждого кластера между собой, будет намного лучше. (так как любое число за пределами кластера уже было бы на расстоянии больше некоторого промежуточного значения, которое вы бы выяснили при первых проходах) – jsbueno
@jsbueno Я предполагаю, что для него есть учебный аспект. – Pouria
Вот быстрое решение только с вложенными for
петли и if
условия; и ничего больше.
Излишне говорить, что это самый неэффективный способ сделать это, но я предполагаю, что есть причина для этого (что-то узнать?). Если это так, вы должны потратить некоторое время на изучение процесса.
my_list = [1, 3, 9, 14, 12, 20, 22]
c = list()
for value_1 in my_list:
for value_2 in my_list:
if value_1 != value_2 and value_2-value_1>0:
c.append({
'val_1': value_1,
'val_2': value_2,
'delta':value_2 - value_1
})
minimum = c[0]['delta']
for item in c:
num = item['delta']
if minimum > num:
minimum = num
print(str.join('\n', [str(item) for item in c if item['delta'] == minimum]))
, которая возвращает:
{'val_1': 1, 'val_2': 3, 'subtraction': 2}
{'val_1': 12, 'val_2': 14, 'subtraction': 2}
{'val_1': 20, 'val_2': 22, 'subtraction': 2}
Да, мы пытаемся выучить алгоритмы, поэтому нам также нужно выполнить одно и то же, используя sorted(), а затем мы должны сравнить, какой из них более эффективен. – PythonSOS
Вы можете сделать это с помощью сортировки в 1 строке! Раньше я делал это со своими учениками. Я больше не занимаюсь. Но если вы хотите сделать это только с помощью 'for' и' if', это единственный способ, которым я могу, и человека, его много! Я не думаю, что я когда-либо писал столько циклов в одном скрипте раньше! – Pouria
Теперь продолжайте и плюс один/принять меня и ответы jsbueno. Я заставил себя подумать, что есть еду, крутя ее вокруг головы 5 раз! Кроме того, у вас есть алгоритм для поиска минимума в качестве бонуса! ;) – Pouria
возможно дубликат [Поиск ближайших точек в списке питона] (https://stackoverflow.com/questions/36831039/finding-closest-points-in-list- python) – zondo
Ваш вопрос столь же широк, как и в прошлый раз, когда вы его просили. – zondo
как еще я должен сделать это более конкретным? Назначение буквально говорит, что мне нужно найти две точки в списке, которые ближе всего. – PythonSOS