LoginSignup
3
1

More than 1 year has passed since last update.

pythonで2次元配列の斜めの要素を取り出す

Posted at

Screenshot 2023-04-14 11.14.37.png

array = [[1, 2, 3, 4, 5],
         [4, 5, 6, 7, 8],
         [4, 5, 6, 7, 8],
         [4, 5, 6, 7, 8],
         [7, 8, 9, 8, 7]]

n = len(array)

リスト内包表記

# 右下→左上
rl_d = [[array[max(0, -d) + i][max(0, d) + i] for i in range(n - abs(d))] for d in range(1-n, n)]
print(rl_d)
>> [[7], [4, 8], [4, 5, 9], [4, 5, 6, 8], [1, 5, 6, 7, 7],
    [2, 6, 7, 8], [3, 7, 8], [4, 8], [5]]
# 左下→右上
lr_d = [[array[max(0, d) + i][min(n + d, n) - i - 1] for i in range(n - abs(d))] for d in range(1 - n, n)]
print(lr_d)
>> [[1], [2, 4], [3, 5, 4], [4, 6, 5, 4], [5, 7, 6, 5, 7],
    [8, 7, 6, 8], [8, 7, 9], [8, 8], [7]]

普通のfor文

# 右下→左上
rl_d = []
for d in range(1 - n, n):
    diagonal = []
    for i in range(n - abs(d)):
        diagonal.append(array[max(0, -d) + i][max(0, d) + i])
    rl_d.append(diagonal)
print(rl_d)
>> [[7], [4, 8], [4, 5, 9], [4, 5, 6, 8], [1, 5, 6, 7, 7],
[2, 6, 7, 8], [3, 7, 8], [4, 8], [5]]
# 左下→右上
lr_d = []
for d in range(1-n, n):
    diagonal = []
    for i in range(n - abs(d)):
        diagonal.append(array[max(0, d) + i][min(n + d, n) - i - 1])
    lr_d.append(diagonal)
print(lr_d)
>> [[1], [2, 4], [3, 5, 4], [4, 6, 5, 4], [5, 7, 6, 5, 7],
[8, 7, 6, 8], [8, 7, 9], [8, 8], [7]]

解説

注意
解説では右下→左上のパターンしかやってません!

まず2次元配列を以下の写真のようにインデックス番号を振って考えます!
image.png

つまり要素の座標(x, y)は↓↓
image.png
このようになります!

この座標を使ってとっていきたい斜めの要素を表すと、右下→左上の場合次のようになります
image.png

xとyで分けてみます
image.png
これでかなりイメージしやすくなったのではないでしょうか
あとは横方向と縦方向の2軸に分けて繰り返し処理をしていく方法を考えるだけです!

x座標

image.png

n - |d|は絶対値ということです!pythonやと→n - abs(d)
max(0, -d)は0と-dの大きい方の値ということです!
このようにするとx座標の値はmax(0, -d) + iで計算できることがわかります!
pythonで書くと↓↓

n = 5 # 2次元配列の大きさ
for d in range(1 - n, n):
    print("------")
    for i in range(n - abs(d)):
        print(max(0, -d) + i)

y座標

image.png

内容は同じなので省きますが、y座標はmax(0, d) + iで確定しそうですね
pythonで書くとこんな感じです↓↓

n = 5
for d in range(1 - n, n):
    print("------")
    for i in range(n - abs(d)):
        print(max(0, d) + i)    

x,y座標合わせる

n = 5

for d in range(1-n, n):
    print('----------')
    for i in range(n - abs(d)):
        print("x, y =", max(0, -d) + i, max(0, d) + i)

出力

出力値を見るとちゃんと斜めの要素の座標を生成できていることがわかります!
最後にこれは座標(インデックス番号)なので、2次元配列の要素を取得しましょう!
array[x][y]という感じになっていればオッケーなので、

array[max(0, -d) + i][max(0, d) + i]

これで値を取れたので、配列に格納すれば終わりっていう感じです!
あざした〜

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1