-1

だから私はリストのリストを持っています

alist = [[distance1,delta-angle1,object1],[distance2,delta-angle2,object2], [distance3,delta-angle3,object3],...]

listそれぞれの最初の2つの要素である「距離」を最大化し、「デルタ角度」を最小化して、alistその特定のリストを返したいと思います。

警告:distanceフロートにdelta-angleなり、度単位になります(-180:180)

目標は、「最もまっすぐな」角度で最長の距離を選択することですが、最長または「最もまっすぐな」角度だけではありません(角度の変化を最小限に抑えることとしても知られています)

編集:画像をアップロードできないので、ここにリンクがあります。

http://imgur.com/a/b6KWM#YqGxdlu

この特別な場合のように、「元の場所に戻る」ことは避けたいと思います。2番目の画像に示すように

画像2

3番目の画像は理想的です-そして私はまだこれを述べるためのより良い方法を考えていなかったので:現在の方位からの角度の変化を最小にし(デルタ角度はすでに保存されているものです)そして利用可能な長さをalist最大にしますdistance線分(次の図では境界上の端点で示されています)

画像3http ://imgur.com/a/b6KWM#YqGxdlu

4

2 に答える 2

1

明確化した後でも、あなたのルールはまだあいまいです。ルールをコーディングする前に、実装するルールを把握する必要があります。

ルールが十分に単純であれば、より高い値を返す関数を記述して一致度を高めることができるはずです。その場合、その関数をkeytoとして渡すことができmaxます(または、実際のユースケースに応じてsorted、 またはなどを使用できます)。heapq.nlargest

たとえば、Blckknght が言うように、ルールが単に「X コンポーネントが最大のオブジェクトが最適」である場合、それはdistance*cos(angle). もちろん、おそらく最大の正または負の X コンポーネントが必要な場合を除いて、実際にはabs(that). そう:

def best(alist):
    return max(alist, key=lambda dao: abs(dao[0] * math.cos(dao[1]))

( の各要素は of であるlistためlistdistance, angle, objectこれらの要素のそれぞれを と呼びました。距離などdaoもそうです。)dao[0]

ルールを 1 つのキー関数に変換する方法がわからない場合はどうすればよいでしょうか?

dao2 つのトリプレットを比較して大きい方を返す比較関数を記述できる場合は、それを関数functools.cmp_to_keyに変換するために使用できkeyます。しかし実際には、関数を書けるのにcmp関数を書けないということは、それほど一般的ではありませんkey

より複雑なものが必要な場合は、いつでもリストを事前にフィルター処理したり、装飾、並べ替え、非装飾などを行うことができます。

たとえば、コメントで次のように言います。

最も有用なのは、-90:0:90 の範囲に収まる長い行であり、それ以外は距離がどれだけ長くてもほとんど役に立ちません。

これはあいまいですが、解釈できる 1 つの方法は次のとおりです。

  • [-90, 90] の範囲の角度を持つオブジェクトがある場合は、それらのオブジェクトから最も長いオブジェクトを選択します。
  • それ以外の場合は、角度が最も小さいオブジェクトを選択します。

それをキー関数として書くこともできますが、方法がわからないふりをして、すべてを明示的にしたいと思います。キー関数を書くのは簡単です — それはキーlongestと同じdao[0]です。また、キー関数を記述するのも簡単です — それはsmallest angleただのabs(dao[1]). そう:

def best(alist):
    acutes = [[d, a, o] for [d, a, o] in alist if abs(a) <= 90]
    if acutes:
        return max(acutes, key=lambda dao: dao[0])
    else:
        return min(alist, key=lambda dao: abs(dao[1]))
于 2013-02-12T01:14:18.477 に答える
0
alist = [[0,0,'b'],[-30,50,'a'],
         [45,63,'d'],[100,170,'d'],
         [-2,15,'p']]

def mM(L):
    x,y,_ = zip(*L)
    return (min(x),max(y))

print mM(alist)

結果

(-30, 170)
于 2013-02-12T01:03:09.873 に答える