0

ソートされていないサイズの2次元タプルのリストがありnます。XとYに最も近い寸法のタプルを見つけたいのですが、これを行うための最良の方法は何ですか?

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

とを使用するtargetvalues、メソッドは答えを生成する必要があります(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. まず、テスト値の2乗xから最適x値を引いたものを取ります。
  2. 次に、テスト値の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 に答える