使用言語 Python3
##.
###
...
上に書いたように3×3のマスがあるとし、そのうち上下左右のマスが「#」であるマスの座標を選ぶプログラムを書きたい。
ちなみに左上のマスを(0,0)とする。
これが
0 0
0 2
と出力するようにしたい。
new_data = [['#','#','.'],['#','#','#'],['.','.','.']]
H = 3 #行数
W = 3 #列数
データはこのように与えられているとする。
私の考えとして
①まずH、Wでfor文を作り、h行w列目を軸として、まずその両隣を見る。ここに「.」があればcontinueで抜ける。
②次に上下を見る。同様に「.」があればcontinueで抜ける。
③for文を抜けずにたどり着いた要素だけprintする
実際にコードで書いてみると
for h in range(H):
for w in range(W):
try:
if new_data[h][w+1] == ".":
continue
except IndexError:
pass
try:
if new_data[h+1][w] == ".":
continue
except IndexError:
pass
if w >= 1:
if new_data[h][w-1] == ".":
continue
if h >= 1:
if new_data[h-1][w] == ".":
continue
print(h,end = " ")
print(w)
これで目的の出力を得ることができた。
このコードではtry文を使うことで、IndexErrorが起こっても対処できるようにした。
あと一点、私が詰まった点として、
new_data[h][w-1]
の記述について。
w=0の時、[w-1]は[-1]となってしまうため、本当gは一番最初の要素が欲しいにも関わらず、列の一番最後の要素が選ばれてしまうというミスをしてしまった。
なのでここではその前にw>=1とし[w-1]が自然数となるように指定した。
リストでマイナスを使うときはこの点に注意していきたい。