2017-04-25 48 views
5

我有排序的值列表表示角度(度),所有的最小範圍[0,360)發現,包括在範圍列表中的所有角度

我的目標是找到最好的範圍(最小範圍)適合列表中的所有角度。

一些例子:

  • 給出的列表angles = [0,1,2,10,20,35]答案是(0,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

你認爲10和370是一樣的角度還是不同? – wim

+0

一樣,我始終代表該範圍內的角度[0,360) – DSLima90

回答

3

這一個班輪應該做的伎倆:

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

(你如果需要,可以事後更改答案值小於360)

+1

因爲''angles''列表排序 – Luchko

+3

@Luchko問題始於:「我有**分類**值的列表」 –

+1

抱歉。 。你得到我的贊同:) – 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]))