2017-04-25 23 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]))