0

我有一个二维元组列表,未排序,n大小。我想找出哪个元组的维度与 X 和 Y 最接近。最好的方法是什么?

target = (75, 75)
values = [
    (38, 61),
    (96, 36),
    (36, 40),
    (99, 83),
    (74, 76),
]

使用targetand values,该方法应该产生答案(74, 76)

编辑

下面的答案将我引向这种确切的方法,适用于任何来到这里的人:

def distance(item, target):
    return ((item[0] - target[0]) ** 2 + (item[1] - target[1]) ** 2) ** 0.5

best = min(values, key=lambda x: distance(x, target))

这是一个笛卡尔距离问题。

  1. 首先取测试值的平方x减去最优x值。
  2. 然后取测试值的平方y减去最佳y值。
  3. 最后取第 1 步加上第 2 步的平方根,得到距离。
  4. 将此应用于列表中的所有项目,最小的数字(使用该min函数)将为您提供最合适的选择。
4

3 回答 3

6
def distance(tup1,tup2):
    """
        This question is unanswerable unless you can specify this

        examples for 2d (you can write more general N-dimensional code if you need):
        cartesian: math.sqrt((tup2[0]-tup1[0])**2 + (tup2[1]-tup1[1])**2)
        manhattan: (tup2[0]-tup1[0]) + (tup2[1]-tup1[1])
    """
    return # YOUR CODE HERE

min(values, key=lambda x:distance(target,x))
于 2012-10-02T19:38:38.220 回答
1

只是问题的另一个角度。由于这是笛卡尔平原的问题,将其转换为复杂的平原并解决

>>> min((abs(complex(*e)-complex(*target)),e) for e in values)[-1]
(74, 76)
于 2012-10-02T19:40:19.383 回答
0
closest = min([(abs(val[0]-target[0])+abs(val[1]-target[1]),val) for val in values])[1]

是一种方式。

于 2012-10-02T19:34:06.510 回答