2016-04-25 55 views
-1

我給了一個整數/花車列表,我需要找到最接近的兩個數字。我將如何做只使用嵌套for循環?列表中最接近的兩點?

+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的答案。我帶着一些想法,把食物旋轉四周,繞着我的頭旋轉!此外,你也有算法找到最小值作爲獎金! ;) – Pouria