2017-04-25 7 views
5

私は(度で)の角度を表し、ソートされた値のリストを持っているが含まれる最小範囲を見つける私の目標は最高の範囲(最小値を見つけることです範囲)を指定します。)0360 [範囲内のすべての、</p> <p>をリスト内のすべての角度

いくつかの例:答えは(0,35)だろうリストangles = [0,1,2,10,20,35]考える

  • 数値が循環的であるため、angles = [10,20,340,355]の場合、答えは(340,20)となります。

私の現在のスクリプトは次のように動作します。

MAX_ANGLE = 360 

def get_best_range(angles): 

    number_of_angles = len(angles) 

    # Append the list of angles with the same angles plus 360 (max value) 
    angles = angles + [angle + MAX_ANGLE for angle in angles] 

    # Create a list of all possible ranges 
    possible_ranges = [(angles[i], angles[i+number_of_angles - 1]) for i in range(number_of_angles)] 

    # Find the best range (minimum range) 
    best_range = min(possible_ranges, key = lambda ang_range: ang_range[1] - ang_range[0]) 

    return best_range[0], best_range[1]%MAX_ANGLE 

まあ、それはこれまでのところ、私の最善のアプローチであり、それは私には良いですO(n)は、で動作しますが、ちょうど思われるがPythonでそれを行うより良い方法かもしれません。円形の値を扱うためのツールかもしれませんか?アングルやその他の円形の値で作業するときは、いつも少し面倒です。 1つのライナーはトリックを行う必要があることを

+1

あなたは10と370が同じであると考えてください。角度または異なる? – wim

+0

同じですが、私は常に、 "angles"リストがソートされていると仮定して、[0,360] – DSLima90

答えて

3

max(zip(angles, angles[1:] + [360+angles[0]]), key = lambda x: x[1]-x[0]) 

(必要な場合は、360よりも小さい値に後で答えを変更することができます)

+1

の範囲の角度を表しています。 – Luchko

+3

@Luchko質問が始まる: "私は**ソートされた**値のリストを持っています" –

+1

あなたは私のupvoteを持っています:) – Luchko

0
def f(my_list): 

    maxi = max(my_list) 
    mini = min(my_list) 
    if maxi - mini < 180: 
     return (mini, maxi) 
    else: 
     return (min([x for x in my_list if x >= 180]), max([x for x in my_list if x<180])) 
関連する問題