找到包含列表中所有角度的最小范围

时间:2017-04-25 16:33:43

标签: python python-3.x

我有一个表示角度(以度为单位)的排序值列表,全部在[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中可能有更好的方法。也许有些工具可以使用循环值?在处理角度或其他圆形值时,我总是有点麻烦。

2 个答案:

答案 0 :(得分:3)

一个班轮应该可以解决问题:

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

(如果需要,您可以将答案更改为小于360的值)

答案 1 :(得分: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]))