2016-04-23 6 views
2

Aus einer Liste von Tupel l, ich muss das Element, das mindestens euklidischen Abstand von Tupel x ist zu filtern.Python - Filter Mindestelement für gegebene Bedingung

  1. Kann ich das Liste Verständnis oder Lambda-Funktion mit? Sie können l = [(0,0), (1,1), (2,3), (3,4), (4,5)] und x=(3,0) nehmen.

  2. Angenommen, es gibt mehrere Elemente in l, deren euklidischer Abstand zur gleichen Zeit minimal ist. Dann muss ich zufällige Elemente von diese Elemente zurückgeben. Kann dies auch mit Listenverständnis oder Lambda-Funktion gemacht werden?

+0

1) Ja. 2) Ja. Hast Du es versucht? –

+0

@DisplayName Ich habe keine Ahnung, wie man das in einer Zeile macht. Für 3 Zeilen Code, ja ich habe. –

Antwort

2

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

+0

Ich habe gerade versucht herum zu golfen. Leistung ist nicht mein Anliegen im Moment, da mein Datensatz klein ist. –

2

ist ein effizienter Ansatz mit Wörterbuch:

from operator import itemgetter 
from random import choice 

def find_mins(x, lst): 
    x1, y1 = x 
    result = {} 
    for x2, y2 in lst: 
     quad_dist = (x1 - x2)**2 + (y1 - y2)**2 
     result.setdefault(quad_dist, []).append((x2, y2)) 
    return choice(min(result.items(), key=itemgetter(0))[1]) 

Demo:

l = [(0,0), (1,1), (2, 2), (2,3), (3,4), (4,5)] 
x = (3,0) 

find_mins(x, l) 
(1, 1) 
find_mins(x, l) 
(2, 2) 
find_mins(x, l) 
(2, 2) 

dieser Funktion werden die Koordinaten auf der Grundlage ihrer Entfernung von den beabsichtigten Punkt kategorisieren dann die Mindest finden auf der Grundlage der Entfernung und Geben Sie die Liste der relativen Koordinaten zurück, und verwenden Sie dann random.choice(), um einen zufälligen Punkt auszuwählen.

Verwandte Themen