私は、pythonを使って作業していますが、キーはそれぞれ3つの値を持つタプルです。どのタプルに最も近い値を持つタプルのグループからタプルを見つけることができますか?
私は3つの値を持つ別のタプルを計算しています。この新しく計算されたタプルに最も近い値を持つ辞書のキーでタプルを探したいと思います。
どうすればいいですか?
私は、pythonを使って作業していますが、キーはそれぞれ3つの値を持つタプルです。どのタプルに最も近い値を持つタプルのグループからタプルを見つけることができますか?
私は3つの値を持つ別のタプルを計算しています。この新しく計算されたタプルに最も近い値を持つ辞書のキーでタプルを探したいと思います。
どうすればいいですか?
あなたは次のことを試してみることができます(リストを使用しました)。単純に各要素を反復し、タプルの各要素の差を取ってから、最後に差の合計をソートして、
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]
あなたはおそらく違いの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)
あなたはこのような何かを行うことができます:
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
パラメータの別の関数を渡すこともできます。
あなたができるfunctools.partialを使用してこれは 'key'を使って、例えば'return min(t、key = functools.partial(dist、target))'または代わりにラムダ 'key = lambda x:dist(x、target)'を使います。 – AChampion
@AChampion提案していただきありがとうございます。 'functools'は私がおそらくもっと探検すべきモジュールの一つです。これは趣味の問題ですが、 'functools'のない1行の定義は' functools'の1行の定義よりも少し読みやすくなっています。 'min'を' key'に渡すタクシーブックのメトリックに対するあなたのソリューションは素晴らしいです。 –
サンプルケースを追加http://stackoverflow.com/help/mcve? – Divakar
@Divakar私は後でもう一度尋ねなければならないでしょう、私はモバイルで、私の目の前にコードを持っていません –
"最も近い"の意味を定義する必要があります – Eric