これは、NumPy を使用しないやや高密度のワンライナーです。
>>> from itertools import combinations
>>> a = [10, 7, 3, 6]
>>> closest_pair = min((abs(x-y), (i, j)) for (i,x), (j, y) in combinations(enumerate(a), 2))[1]
>>> closest_pair
(1, 3)
これがどのように機能するかです...
combinations
すべてのペアを作成するために使用されます。
>>> list(combinations(a, 2))
[(10, 7), (10, 3), (10, 6), (7, 3), (7, 6), (3, 6)]
要素のインデックスが必要なので、次のように変更します。
>>> list(combinations(enumerate(a), 2))
[((0, 10), (1, 7)),
((0, 10), (2, 3)),
((0, 10), (3, 6)),
((1, 7), (2, 3)),
((1, 7), (3, 6)),
((2, 3), (3, 6))]
リスト内包表記はこの結果に作用し、絶対差と対応するインデックスのペアの新しいリストを形成します。
>>> [(abs(x - y), (i, j)) for (i,x), (j, y) in combinations(enumerate(a), 2)]
[(3, (0, 1)), (7, (0, 2)), (4, (0, 3)), (4, (1, 2)), (1, (1, 3)), (3, (2, 3))]
最小値を取ると、最初の値が最小絶対距離で、2 番目の値がインデックスのタプルであるタプルが得られます。
>>> min((abs(x - y), (i, j)) for (i,x), (j, y) in combinations(enumerate(a), 2))
(1, (1, 3))
最後に、その結果からインデックスだけを引き出します。
>>> min((abs(x - y), (i, j)) for (i,x), (j, y) in combinations(enumerate(a), 2))[1]
(1, 3)