2016-05-16 5 views
0

Als Teil eines Skripts, das ich mache, möchte ich eine Reihe von Punkten gegen den Uhrzeigersinn um einen zentralen Punkt sortieren, den wir 'a' nennen.Erzeugen einer Sortierfunktion gegen den Uhrzeigersinn Sortierung

Ich habe eine Funktion, die für zwei Punkte 'b' und 'c' bestimmt, ob c rechts oder links vom Strahl a-> b ist. Diese Funktion ist right_of (a, b, c) und ist getestet und funktioniert.

Ich möchte diese Funktion verwenden, um eine Liste von Tupeln mit 2D-Koordinaten zu sortieren, z. [(0, 0), (0, 1), (1, 1), ...]. Jedes Mal, wenn ich sortiere, wird jedoch ein anderer Punkt "a" an die Funktion right_of() übergeben. Was ich will, ist eine 'Funktion' returnSortFunction (a), die eine Funktion mit zwei Argumenten zurückgibt, f (b, c), und und wenn f (b, c) für jedes Koordinatenpaar aufgerufen wird, sollte ich es sortieren gib das Ergebnis von right_of (a, b, c) mit 'a' bereits ausgefüllt zurück.

Ich habe versucht, dies mit einer Fabrik zu implementieren, aber ich glaube nicht, dass ich Fabriken gut genug verstehe, um es richtig zu machen, oder feststellen, ob das für eine Fabrik nicht so ist. Wie kann ich diese Funktion erstellen?

+2

'def returnSortFunction (a): return '[' functools.partial'] (https://docs.python.org/3/library/functools.html#functools.partial) '(right_of, a)' Das scheint Sie zu fragen aber ich denke nicht, dass es dein Problem lösen wird, vielleicht den Code, mit dem du arbeitest, und den Eingang/Ausgang und die gewünschte Ausgabe zeigen. –

+0

Nein, genau das suche ich. Danke für die schnelle Antwort. – kingledion

Antwort

1

Sie können eine Funktion haben, die eine Funktion zurückgibt, kein Problem. Ein einfacher Weg, es zu tun, ist so etwas wie

1

Sie benötigen eine Wrapper-Funktion rund um Ihre Funktion Right_of. Du könntest ein Lambda verwenden, aber ich denke deine Logik wird komplizierter sein als das. Angenommen, Sie sind in einer Funktion als Komparator auf Ihre Sortiermethode übergeben wollen, geht es so etwas wie folgt aussehen:

def returnSortFunction(a): 
    def comparator(p1, p2, a = a): 
     if p1 == p2: 
      return 0 
     elif right_of(a, p1, p2): 
      return 1 
     else: 
      return -1 
    return comparator 
1

Funktionen sind erstklassige Objekte in Python, so können Sie etwas tun:

def prepare_funcs(number): 
    def inc(a): 
     return number + a 
    def mult(a): 
     return number * a 
    return inc, mult 

inc5, mult5 = prepare_funcs(5) 
inc2, mult2 = prepare_funcs(2) 

inc5(2) #Out: 7 
mult2(10) #Out: 20 

Für Ihren spezifischen Kontext sollten Sie auch functools Modul, insbesondere Teilfunktion auschecken. Mit ihm können Sie 'teilweise' bereiten Argumente auf Ihre Funktion wie folgt aus:

right_of_5 = functools(right_of, 5) 
right_of_5(b, c) 

Das funktioniert, weil right_of_5 automatisch right_of erste Argument füllen - ein - mit der Nummer 5.

Verwandte Themen