2016-05-18 3 views
-2

私は極小値に応じてx-y平面内のポイントのリストを、最小y値を持つリストから選択したポイントでソートしようとしています。ソートのキーとしてパラメータを変更する関数を使用する

私はその可能な場合、私は思っていた二つの点

def theta(pointA, pointB): 

    dx = pointB[0] - pointA[0] 
    dy = pointB[1] - pointA[1] 
    if abs(dx) < 1.e-6 and abs(dy) < 1.e-6: 
     t = 0 
    else: 
     t = dy/(abs(dx) + abs(dy)) 
    if dx < 0: 
     t = 2 - t 
    elif dy < 0: 
     t = 4 + t 
    return t * 90 

間の角度を見つけるために、機能シータを有するlistPts

における最小のy値を見つけるために

min(listPts, key=lambda t: (t[1], -t[0])) 

を使用何らかの理由でこの点を.sort()メソッドのキーとして使用すると、チェックされる各点はthetaの点Bが異なります。

歓声

答えて

1

はい。 Read the documentation for list.sort、それはそこにある。引数はminと同じ名前でもあります。

更新:私はあなたの本当の問題を理解していれば、thetaは、ポイント間の相対角度を計算している、とあなたは何とか自分のthetaスコアに基づいてポイントペアをソートしたいですか?

それが正しいなら、あなたは本当に多段階のプロセスが必要になります。

  1. は、各原点と目的地のためのすべての点の対(いずれかのすべての可能なポイントの順列/組み合わせを生成する、またはあるいくつかの初期ペアリングアルゴリズムによるそのためには自分のシータスコア

に基づくペアは、あなたは、いくつかの一貫性のあるポイントの順序を取得するために、ペア(またはソート最初に生成するitertools.permutationsを使用し、その後を使用

  • )より選択ソートポイントのペアを作成しないで、thetaを使用して結果のペアをソートし、相対角度でペアを並べ替えます。例えば:

    [((-2, 0), (1, 0)), ((-4, 1), (1, 1)), ..., ((1, 0), (-4, 1)), ((4, -3), (-3, -2))] 
    

    [0.0, 0.0, ..., 165.0, 168.75]theta値に対応する:出力

    import itertools 
    from operator import itemgetter 
    
    points = [(1, 0), (1, 1), (4, -3), (5, 5), (-2, 0), (-4, 1), (-3, -2)] 
    
    points.sort(key=itemgetter(1, 0)) # Sorts by y then by x; caps theta to range(0, 180) 
    
    point_pairs = itertools.combinations(points, 2) # Generates unique pairs of points 
    
    # Sort using key function that unpacks point pairs as arguments to theta 
    point_pairs = sorted(point_pairs, key=lambda x: theta(*x)) 
    
    print(point_pairs) 
    

  • +0

    返事をありがとう、この質問は本当にひどく言われました。私は関数がドキュメントからキーとして渡すことができることを理解していますが、この場合、ソートされている各ポイント(pointB)に対して新しい第2パラメータを与える必要がありますか? – saleem

    +0

    @saleem:これは 'cmp'関数です(Py2のみ)。しかし、ドキュメントを読めば(真剣に私はここのドキュメントをリンクしています)、古いスタイルの 'cmp'関数を' key'関数に変換するユーティリティに直接リンクします。それは簡単です。 – ShadowRanger

    +0

    @saleem:あなたが使用している関数を読んでいると、それはコンパレータ関数ではありません(戻り値は負ではなく、相対的な順序を示す0または正ではありません)。それはちょうど2つのポイントがどれほど離れているか、角度にそって言うことです。しかし、離散点を相対角度でソートすることはできません。あなたはどのように異なる位置で2点の対を扱いますか?ポイントペアを相対位置で並べ替えるようにしたいので、実際には単一のポイントが結果に何度も現れるでしょうか? – ShadowRanger

    関連する問題