Zuerst sollten Sie eine Funktion definieren, um die Euclidian distance zu erhalten. Eine Möglichkeit wäre, die Tupel einfach in komplexe Zahlen zu konvertieren und ihre absolute Differenz zu erhalten.
>>> dist = lambda t1, t2: abs(complex(*t1) - complex(*t2))
Alternativ können Sie Ihre eigene Funktion definieren. Das könnte sogar schneller sein, da Sie die Quadratwurzel nicht wirklich brauchen, wenn Sie nur den Wert finden wollen, der den Mindestabstand hat. Sie können diese Funktion dann als eine Schlüsselfunktion für das eingebaute verwenden.
>>> l = [(0,0), (1,1), (2,3), (3,4), (4,5)]
>>> x = (3,0)
>>> min(l, key = lambda y: dist(y, x))
(1, 1)
Wenn Sie alle Mindestwerte erhalten möchten, können Sie diesen Wert in einer Variablen speichern und eine Liste Verständnis verwenden, um alle Werte zu erhalten, deren Abstand gleich diesem Wert.
>>> m = min(dist(y, x) for y in l)
>>> [y for y in l if dist(x, y) == m]
[(1, 1)]
Wenn Sie einen zufälligen Wert derer möchten, verwenden Sie random.choice
:
>>> random.choice(_)
(1, 1)
Beachten Sie jedoch, dass dieser Ansatz die Liste zweimal durchlaufen und auch die Entfernung der einzelnen Wert zweimal berechnen - einmal, um den (beliebigen) Mindestwert zu finden, und dann erneut, um jeden Wert mit diesem Minimum zu vergleichen. Wenn die Leistung sehr wichtig ist, sollten Sie die App @Kasramvd verwenden. Hier
1) Ja. 2) Ja. Hast Du es versucht? –
@DisplayName Ich habe keine Ahnung, wie man das in einer Zeile macht. Für 3 Zeilen Code, ja ich habe. –