2016-04-25 2 views
-1

Мне дан список целых чисел/поплавков, и мне нужно найти два числа, наиболее близкие друг другу. Как я могу это сделать, используя только вложенные для циклов?Две самые близкие точки в списке?

+0

возможно дубликат [Поиск ближайших точек в списке питона] (https://stackoverflow.com/questions/36831039/finding-closest-points-in-list- python) – zondo

+0

Ваш вопрос столь же широк, как и в прошлый раз, когда вы его просили. – zondo

+0

как еще я должен сделать это более конкретным? Назначение буквально говорит, что мне нужно найти две точки в списке, которые ближе всего. – PythonSOS

ответ

0

Для каждого элемента вам необходимо сравнить его расстояние с каждым другим элементом с вашим предыдущим «самым близким» значением - в любое время, когда это сравнение дает меньшие значения, вы помните, что эта пара является «двумя ближайшими».

Таким образом, это просто:

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 
+0

спасибо! это именно то, что я искал! – PythonSOS

+0

Не то, чтобы это «тупая» вещь O (N²) - так, около 1000 чисел, вы делаете 1000000 comaprisons, что может быть хорошо для вашей цели. Если вам нужны более разумные способы, алгоритм, который разбивает ваш список в кластерах, сгруппированных по взаимной близости, и только сравнить элементы внутри каждого кластера между собой, будет намного лучше. (так как любое число за пределами кластера уже было бы на расстоянии больше некоторого промежуточного значения, которое вы бы выяснили при первых проходах) – jsbueno

+0

@jsbueno Я предполагаю, что для него есть учебный аспект. – Pouria

0

Вот быстрое решение только с вложенными 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} 
+0

Да, мы пытаемся выучить алгоритмы, поэтому нам также нужно выполнить одно и то же, используя sorted(), а затем мы должны сравнить, какой из них более эффективен. – PythonSOS

+0

Вы можете сделать это с помощью сортировки в 1 строке! Раньше я делал это со своими учениками. Я больше не занимаюсь. Но если вы хотите сделать это только с помощью 'for' и' if', это единственный способ, которым я могу, и человека, его много! Я не думаю, что я когда-либо писал столько циклов в одном скрипте раньше! – Pouria

+0

Теперь продолжайте и плюс один/принять меня и ответы jsbueno. Я заставил себя подумать, что есть еду, крутя ее вокруг головы 5 раз! Кроме того, у вас есть алгоритм для поиска минимума в качестве бонуса! ;) – Pouria