

if文で配列にTrueを入れたいです。

[code]

    circle_lists =[[0,10,30],[5,-10,30],[100,10,20]]
    overlap_list = [False] * len(circle_lists)
    
    def calc(array):
     for i in range(len(array)):
      for j in range(i + 1, len(array)):
       if (array[0][i] - array[0][j]) ** 2 + (array[1][i] - array[1][j]) ** 2 < (array[2][i] + array[2][j]) ** 2:
           overlap_list[i] = True
           overlap_list[j] = True
    
    
    calc(circle_lists)
    print(overlap_list)
    
[/code]

このコードを実行すると、  
[True, True, True]  
と出力されました。

[code]

    if (array[0][i] - array[0][j]) ** 2 + (array[1][i] - array[1][j]) ** 2 < (array[2][i] + array[2][j]) ** 2:
    
[/code]

の条件式が満たされるのは`[0,10,30],[5,-10,30]`の時のみです。  
なので、[True, True, False]と出力させたいです。

[[0,10,30],[5,-10,30],[100,10,20]] のインデックスは[False, False,
False]のインデックスと一致しています。なのでそのような出力にさせたいです。  
circle_lists の要素数が多くなることを踏まえ、後半の要素は見なくても済むようにしたいです。なので２重for文で[False, False,
False]をTrueに変えたいです。  
なにが間違っているのでしょうか？


CC BY-SA 3.0
2017-07-17T09:42:51.353
36446
2017-12-11T14:26:00.760
24451
question
python
if文で配列にTrueを入れたい


質問内容を下記のように仮定して回答します。  
かなりの部分を憶測で補っていますので、勘違いなどありましたらコメント等でご指摘ください。  
質問が意図通りならば質問の本文を編集していただきますようお願いします。

# 質問

配列の要素同士を比較して、条件式に合致する要素が一つでもあればTrue判定を行いたい。

下記の2次元配列が存在します。  
`[[ax,ay,az],[bx,by,bz],[cx,cy,cz],...]`  
ax～czは0や負数を含む任意の整数で、2次元目の要素数は3で固定です。

この時、1次元目の任意の要素を取り出して、それ以外の要素それぞれと下記のような条件式で比較を行います。

条件式は`(bx-ax)**2+(by-ay)**2 < (bz+az)**2`や`(cx-ax)**2+(cy-ay)**2 <
(cz+az)**2`のようになります。  
`[ax,ay,az]`に対して上記のいずれかが条件を満たす場合はTrueを格納し、それ以外の場合はFalseを格納する配列を作成しようとしています。

具体例として`[[0,10,30](A),[5,-10,30](B),[100,10,20](C)]`という配列があるとします。(丸括弧内は下記説明のための記号)  
AをB,Cに対して条件式で評価するとBがTrueとなり、Bに対してA,Cを評価するとAがTrueとなりますが、Cに対してA,Bを評価するとA,BともFalseとなります。

このとき、新しい配列として`[True(Aに対してTrueとなる要素がある), True(Bに対して左と同様),
False(Cに対してTrueとなる要素がない)]`を作成したいのですが、下記のコードでは求める結果が得られません。

どのように修正すればよいでしょうか。

[code]

    circle_lists =[[0,10,30],[5,-10,30],[100,10,20]]
    overlap_list = [False] * len(circle_lists)
    
    def calc(array):
     for i in range(len(array)):
      for j in range(i + 1, len(array)):
       if (array[0][i] - array[0][j]) ** 2 + (array[1][i] - array[1][j]) ** 2 < (array[2][i] + array[2][j]) ** 2:
           overlap_list[i] = True
           overlap_list[j] = True
    
    calc(circle_lists)
    print(overlap_list) #[True, True, False]と出力させたいが、[True, True, True]と出力される
    
[/code]

# 回答

例えば`(array[0][i] - array[0][j]) ** 2 + (array[1][i] - array[1][j]) ** 2 <
(array[2][i] + array[2][j]) ** 2`は、質問内容でいうところの`(ax-ay)**2+(bx-
by)**2<(cx+cy)**2`のような構文となります。

まずは添字の使い方が意図するコードと合致しているかご確認をお願いします。  
if文の添字を`[0][i]`→`[i][0]`のようにひっくり返すことで質問内容の条件式と同等の評価となり、配列の要素が増えても求める値を取得できます。

[code]

    circle_lists =[[0,10,30],[5,-10,30],[100,10,20]]
    overlap_list = [False] * len(circle_lists)
    
    def calc(array):
      for i in range(len(array)):
        for j in range(i + 1, len(array)):
          if (array[i][0] - array[j][0]) ** 2 + (array[i][1] - array[j][1]) ** 2 < (array[i][2] + array[j][2]) ** 2:
            overlap_list[i] = True
            overlap_list[j] = True
    
    calc(circle_lists)
    print(overlap_list) #[True, True, False]
    
[/code]


CC BY-SA 3.0
2017-07-18T04:47:47.447
36463
2017-07-18T04:47:47.447
9820
36446
answer