2017-02-09 5 views
2

Iは角度パイソンの範囲を使用して循環リストを作成

何か

[1,22]、[2のような角度のセットの上下限が含まれているリストのリストを持っています、24] ... [359,15]、[360,21]]総

360の要素は今、私は1から360までの各角度のためにすることを含むリスト内の要素をチェックします角度

私はrange又はnp.arange(lower,upper)と、リストのすべての要素を作成し、角度が含まれているかどうかを確認するために下限と上限を用いて考えていたが、下部は上部

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

Iよりも高い場合np.arangeは、空のリストを生成しますitertoolscycleも試してみましたが、このケースではどのように適用できるのか分かりません

+0

は、すべての要素は、最終的には、SELに含まれないのだろうか? – user3684792

答えて

0

カスタマイズされた比較機能を使用していますか?

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

誤った比較機能を使用して編集しました。 –

2

これを行うための標準的な方法は、モジュラスを使用することです:角度は間隔のいずれかである場合

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)) 

次にテストします。 sschuberthによるThis answerはC/C++でこれを行う方法を示しています。

ここにPythonの実装とテストがあります。 Python a % bには常にbという符号が付いているので、コードはPythonではより簡単です。

テストコードは、セクタがaで始まり、スルー掃引30のステップで0〜360度のすべての角度xをテスト、ab 60のステップで0〜360度から角度の全ての対をループ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]] 
関連する問題