列表中最近的两个点?

时间:2016-04-25 15:42:28

标签: python python-2.7 for-loop closest-points

我得到一个整数/浮点数列表,我需要找到最接近的两个数字。如何仅使用嵌套的for循环?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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}

答案 2 :(得分:0)

不必每两个点都检查一次,因为O(n ^ 2)很慢。

我建议:
1)对输入进行排序。
2)比较以下两个值,然后选择最小值。
假设您使用高效的排序算法,则计时会更好(O * n * log n)。

代码示例:

input = [0, 65, 10, 100, 1231] #whatever you put here; it might be tuple, list, set, range, etc.

def find_closest(input):
    sorted_input = sorted(input)
    best = (sorted_input[-2], sorted_input[-1], sorted_input[-1] - sorted_input[-2])
    for i, val in enumerate(sorted_input[:-1]):
        d = sorted_input[i+1]-val
        best = (val, sorted_input[i+1], d) if d < best[2]
return best

函数同时返回值和它们之间的距离。

答案 3 :(得分:0)

如果这些点是一维的(如您输入的只是[1, 4, 6, 2]之类的数字列表),则可以在O(n log n)时间内通过对它们进行排序并用最小的差异:

def smallest_difference(points):
    sorted_points = sorted(points)
    return min(abs(prev - cur) for cur, prev in zip(sorted_points, sorted_points[1:]))

如果要获取最接近的点而不是最接近的点之间的距离,请使用key=函数的min参数:

import operator

def smallest_difference(points):
    sorted_points = sorted(points)
    return min(zip(sorted_points, sorted_points[1:]), key=lambda x: abs(x[1] - x[0]))

如果点是二维的(如在您的输入中是2个元素元组的列表,如[(1, 2), (3, 4), (5, 2)]),则有关此问题的维基百科文章https://en.wikipedia.org/wiki/Closest_pair_of_points_problem描述了如何将其扩展到二维。 / p>