2016-04-25 3 views
-1

整数/浮動小数点数のリストが与えられています。私は、最も近い2つの数を見つける必要があります。 forループのみをネストするとどうすればいいですか?2つのポイントがリストにありますか?

+0

[リストPythonで最も近い点を見つける]の可能な重複(https://stackoverflow.com/questions/36831039/finding-closest-points-in-list- Python) – zondo

+0

あなたの質問はあなたが最後に頼んだときと同じくらい広いです。 – zondo

+0

どうすればより具体的にするのですか?割り当ては、文字通り、一緒に最も近いリスト内の2つのポイントを見つける必要があると言っています。 – 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人の熟練しています。よりスマートな方法が必要な場合は、相互に近接してグループ化されたクラスターでリストを分割し、各クラスター内の要素のみを比較するアルゴリズムがはるかに優れています。 (クラスタの外にある数字はすでに最初のパスで分かっていたいくつかの中間値よりもすでに離れているから) – jsbueno

+0

@jsbueno私はそこに学習面があると思う。 – Pouria

0

はクイックフィックス、ネストされたループとforif条件付きです。何もありません。

これは最も効率の悪い方法ではありませんが、何かを学ぶ理由があると思います。そのような場合は、プロセスを学ぶためにしばらく時間を費やす必要があります。

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'だけを使ってそれをしたいのなら、これが私ができることができる唯一の方法です、そして、人、それはたくさんあります!私は前に1つのスクリプトでこれほど多くのループを書いたことはないと思います! – Pouria

+0

今、プラス1 /私とjsbuenoの答えを受け入れてください。私は私の頭の周りに5回ラウンドでそれを回転させることによって食べ物を食べることを考えました!また、ボーナスとして最小値を見つけるアルゴリズムもあります! ;) – Pouria

関連する問題