2016-12-11 6 views
0

私は、pythonを使って作業していますが、キーはそれぞれ3つの値を持つタプルです。どのタプルに最も近い値を持つタプルのグループからタプルを見つけることができますか?

私は3つの値を持つ別のタプルを計算しています。この新しく計算されたタプルに最も近い値を持つ辞書のキーでタプルを探したいと思います。

どうすればいいですか?

+2

サンプルケースを追加http://stackoverflow.com/help/mcve? – Divakar

+0

@Divakar私は後でもう一度尋ねなければならないでしょう、私はモバイルで、私の目の前にコードを持っていません –

+0

"最も近い"の意味を定義する必要があります – Eric

答えて

0

あなたは次のことを試してみることができます(リストを使用しました)。単純に各要素を反復し、タプルの各要素の差を取ってから、最後に差の合計をソートして、

a = [(1, 2, 3), (3, 4, 5), (5, 6, 7)] 
b = (2, 4, 5) 
c = [] 
for x in a: 
    c[a.index(x)] = 0 
    for i in range(len(x)): 
      c[i]+=x[i]-b[i] 
1

あなたはおそらく違いのabs()、例えばを探しています:

>>> from random import randint 
>>> d = [tuple(randint(1, 20) for _ in range(3)) for _ in range(5)] 
>>> d 
[(4, 13, 10), (12, 18, 19), (11, 18, 8), (16, 17, 4), (2, 4, 10)] 
>>> k = tuple(randint(1, 20) for _ in range(3)) 
>>> k 
(14, 13, 1) 
>>> min(d, key=lambda x: sum(abs(m-n) for m, n in zip(k, x))) 
(16, 17, 4) 
1

あなたはこのような何かを行うことができます:

def euclid2(x,y): 
    return sum((xi-yi)**2 for xi,yi in zip(x,y)) 

def closestTuple(target,tuples, dist = euclid2): 
    return min((dist(t,target),t) for t in tuples)[1] 

#test: 
target = (3,5,1) 
tuples = [(3,1,2), (4,1,5), (6,1,7), (4,4,2), (1,5,7)] 
print(closestTuple(target,tuples)) #prints (4,4,2) 

ユークリッドメトリックでターゲットタプルに最も近いタプルを見つけます。もちろん、distパラメータの別の関数を渡すこともできます。

+0

あなたができるfunctools.partialを使用してこれは 'key'を使って、例えば'return min(t、key = functools.partial(dist、target))'または代わりにラムダ 'key = lambda x:dist(x、target)'を使います。 – AChampion

+0

@AChampion提案していただきありがとうございます。 'functools'は私がおそらくもっと探検すべきモジュールの一つです。これは趣味の問題ですが、 'functools'のない1行の定義は' functools'の1行の定義よりも少し読みやすくなっています。 'min'を' key'に渡すタクシーブックのメトリックに対するあなたのソリューションは素晴らしいです。 –

関連する問題