2017-02-09 14 views
2

У меня есть список списков, содержащий нижний и верхний предел множеств угловсоздать циклический список, используя диапазон углов питона

что-то вроде

[[1,22], [2 , 24] ... [359,15], [360,21]]

360 элементов в общей

Теперь я хочу, чтобы проверить для каждого угла от 1 до 360 элементов в списке, который содержит, что угол

Я думал об использовании нижних и верхних пределов, чтобы создать все элементы списка с range или np.arange(lower,upper) и проверить, если угол содержится, но np.arange генерирует пустой список, когда нижний выше верхней

for i in range(1,361): 
    sel=[] 
    for coe in coef: 
     if i in range(coe[0],coe[1]): 
      sel.append(coe) 

I попробовал также с itertools и cycle, но я не вижу, как он может быть применен в этом случае

+0

не все элементы в конечном итоге будут включены в Сель, если вы пробегаем по всем возможным углам? – user3684792

ответ

0

Возможно, используя индивидуальную функцию сравнения?

def compare(angle, lower, upper): 
     if lower <= upper: 
      return lower <= angle and angle <= upper 
     else: 
      return ((angle >= lower and angle <= 360) 
        or (angle <= upper and angle >= 1)) 

Затем проверьте, если угол находится в любом из интервалов:

>>> angle 
    3 
    >>> intervals 
    [[1,22],[2,24]...[359,15],[360,21]] 
    >>> any([compare(angle, *interval) for interval in intervals]) 
    True 
+0

Я использовал неправильную функцию сравнения, отредактировал. –

2

Стандартный способ сделать это состоит в использовании модуль. This answer от sschuberth показывает, как это сделать в C/C++.

Вот реализация и тест на Python. Код проще в Python, потому что в Python a % b всегда имеет тот же знак, что и b.

тест код перебирает все пары углов от 0 до 360 градусов с шагом 60, для a и b, проверяя все углы x от 0 до 360 градусов с шагом 30. Сектор начинается a и несется через до b. Таким образом, сектор (60, 120) содержит 60 °, но (120, 60) содержит 300 °.

Если x находится в этом секторе (включая конечные точки), он добавляется в список result.

def in_angle_interval(x, a, b): 
    return (x - a) % 360 <= (b - a) % 360 

# test 

for a in range(0, 420, 60): 
    for b in range(0, 420, 60): 
     result = [x for x in range(0, 390, 30) if in_angle_interval(x, a, b)] 
     print('{:3}-{:3} {}'.format(a, b, result)) 

выход

0- 0 [0, 360] 
    0- 60 [0, 30, 60, 360] 
    0-120 [0, 30, 60, 90, 120, 360] 
    0-180 [0, 30, 60, 90, 120, 150, 180, 360] 
    0-240 [0, 30, 60, 90, 120, 150, 180, 210, 240, 360] 
    0-300 [0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 360] 
    0-360 [0, 360] 
60- 0 [0, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330, 360] 
60- 60 [60] 
60-120 [60, 90, 120] 
60-180 [60, 90, 120, 150, 180] 
60-240 [60, 90, 120, 150, 180, 210, 240] 
60-300 [60, 90, 120, 150, 180, 210, 240, 270, 300] 
60-360 [0, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330, 360] 
120- 0 [0, 120, 150, 180, 210, 240, 270, 300, 330, 360] 
120- 60 [0, 30, 60, 120, 150, 180, 210, 240, 270, 300, 330, 360] 
120-120 [120] 
120-180 [120, 150, 180] 
120-240 [120, 150, 180, 210, 240] 
120-300 [120, 150, 180, 210, 240, 270, 300] 
120-360 [0, 120, 150, 180, 210, 240, 270, 300, 330, 360] 
180- 0 [0, 180, 210, 240, 270, 300, 330, 360] 
180- 60 [0, 30, 60, 180, 210, 240, 270, 300, 330, 360] 
180-120 [0, 30, 60, 90, 120, 180, 210, 240, 270, 300, 330, 360] 
180-180 [180] 
180-240 [180, 210, 240] 
180-300 [180, 210, 240, 270, 300] 
180-360 [0, 180, 210, 240, 270, 300, 330, 360] 
240- 0 [0, 240, 270, 300, 330, 360] 
240- 60 [0, 30, 60, 240, 270, 300, 330, 360] 
240-120 [0, 30, 60, 90, 120, 240, 270, 300, 330, 360] 
240-180 [0, 30, 60, 90, 120, 150, 180, 240, 270, 300, 330, 360] 
240-240 [240] 
240-300 [240, 270, 300] 
240-360 [0, 240, 270, 300, 330, 360] 
300- 0 [0, 300, 330, 360] 
300- 60 [0, 30, 60, 300, 330, 360] 
300-120 [0, 30, 60, 90, 120, 300, 330, 360] 
300-180 [0, 30, 60, 90, 120, 150, 180, 300, 330, 360] 
300-240 [0, 30, 60, 90, 120, 150, 180, 210, 240, 300, 330, 360] 
300-300 [300] 
300-360 [0, 300, 330, 360] 
360- 0 [0, 360] 
360- 60 [0, 30, 60, 360] 
360-120 [0, 30, 60, 90, 120, 360] 
360-180 [0, 30, 60, 90, 120, 150, 180, 360] 
360-240 [0, 30, 60, 90, 120, 150, 180, 210, 240, 360] 
360-300 [0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 360] 
360-360 [0, 360] 

А вот тест с использованием данных в вопросе.

coef = [[1,22], [2,24], [359,15], [360,21]] 
print(coef) 
for x in range(0, 361): 
    sel = [coe for coe in coef if in_angle_interval(x, coe[0], coe[1])] 
    if sel: 
     print('{:3} {}'.format(x, sel)) 

выход

[[1, 22], [2, 24], [359, 15], [360, 21]] 
    0 [[359, 15], [360, 21]] 
    1 [[1, 22], [359, 15], [360, 21]] 
    2 [[1, 22], [2, 24], [359, 15], [360, 21]] 
    3 [[1, 22], [2, 24], [359, 15], [360, 21]] 
    4 [[1, 22], [2, 24], [359, 15], [360, 21]] 
    5 [[1, 22], [2, 24], [359, 15], [360, 21]] 
    6 [[1, 22], [2, 24], [359, 15], [360, 21]] 
    7 [[1, 22], [2, 24], [359, 15], [360, 21]] 
    8 [[1, 22], [2, 24], [359, 15], [360, 21]] 
    9 [[1, 22], [2, 24], [359, 15], [360, 21]] 
10 [[1, 22], [2, 24], [359, 15], [360, 21]] 
11 [[1, 22], [2, 24], [359, 15], [360, 21]] 
12 [[1, 22], [2, 24], [359, 15], [360, 21]] 
13 [[1, 22], [2, 24], [359, 15], [360, 21]] 
14 [[1, 22], [2, 24], [359, 15], [360, 21]] 
15 [[1, 22], [2, 24], [359, 15], [360, 21]] 
16 [[1, 22], [2, 24], [360, 21]] 
17 [[1, 22], [2, 24], [360, 21]] 
18 [[1, 22], [2, 24], [360, 21]] 
19 [[1, 22], [2, 24], [360, 21]] 
20 [[1, 22], [2, 24], [360, 21]] 
21 [[1, 22], [2, 24], [360, 21]] 
22 [[1, 22], [2, 24]] 
23 [[2, 24]] 
24 [[2, 24]] 
359 [[359, 15]] 
360 [[359, 15], [360, 21]] 

 Смежные вопросы

  • Нет связанных вопросов^_^