例
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次元配列を以下の写真のようにインデックス番号を振って考えます!
この座標を使ってとっていきたい斜めの要素を表すと、右下→左上の場合次のようになります
xとyで分けてみます
これでかなりイメージしやすくなったのではないでしょうか
あとは横方向と縦方向の2軸に分けて繰り返し処理をしていく方法を考えるだけです!
x座標
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座標
内容は同じなので省きますが、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]
これで値を取れたので、配列に格納すれば終わりっていう感じです!
あざした〜