2016-05-16 49 views
0

私が作成しているスクリプトの一環として、一連の点を中心点を中心に反時計回りに並べ替える必要があります。これを「a」と呼びます。反時計回りソートのソート関数の生成

私は2点 'b'と 'c'について、cが光線a-> bの右または左にあるかどうかを決定する関数を持っています。この関数はright_of(a、b、c)であり、テストされて動作します。

この関数を使用して2次元座標のタプルのリストをソートする必要があります。 [(0,0)、(0,1)、(1,1)、...]。しかし、私がソートするたびに、関数 'right_of()に渡す別のポイント' a 'があります。私が望むのは、2つの引数f(b、c)を持つ関数を返す関数 'returnSortFunction(a)と、ソート時にf(b、c)が座標の各ペアで呼び出されるときです。

私は工場を使ってこれを実装しようとしましたが、工場を正しく理解するのに十分なことは分かりませんが、工場がそうでないかどうかを判断することができます。この機能を構築するにはどうすればよいですか?

+2

'デフreturnSortFunction(Aとright_of_5が自動的に最初の引数right_of記入しますので、動作します

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

:これを使うと、「部分的に」は、このようなあなたの関数の引数を準備することができます):return' ['functools.partial'](https://docs.python.org/3/library/functools.html#functools.partial)'(right_of、a)それはあなたが求めているようです私はそれがあなたの問題を解決するとは思わない、多分あなたが作業しているコードを含めると、入出力と希望の出力を表示します。 –

+0

これはまさしく私が探しているものではありません。速い答えをありがとう。 – kingledion

答えて

1

関数を関数に戻しても問題はありません。簡単な方法は次のようなものです

def returnSortFunction(a): 
    return lambda b,c: right_of(a,b,c) 
1

right_of関数の周りにラッパー関数が必要です。あなたはラムダを使うことができますが、あなたのロジックはそれより複雑になると思います。

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

関数をPythonでファーストクラスのオブジェクトであるので、あなたはこのような何かを行うことができます:あなたはあなたのソート方法をコンパレータとしての機能に渡したいと仮定すると、このような何かを見るために起こっている

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 

具体的な内容については、functoolsモジュール、特に部分的な機能もチェックしてください。 - - 数5

関連する問題