python勉強10日目 二次元配列とfor文のネスト
二次元配列
二次元配列とは、配列(リスト)が入った配列(リスト)のこと
number = [
[1,2,3,4,5,6,7,8,9,10],
[11,12,13,14,15,16,17,18,19,20],
[21,22,23,24,25,26,27,28,29,30]
]
例えばこういうもの。
二次元配列の要素にアクセスするには「(変数名)[行インデックスNo][列インデックスNo]」という形でアクセスする。
上記のサンプルコードで例えば「3」を出力したいと思った場合、変数名は「number」行インデックスNoは「0」(pythonは0から数えることに注意)列インデックスNoは「2」なので「print(number[0][2])」とコードを書けば3が出力される。
for文のネスト
for文の中にfor文を書く(ネストという)ことで、2重ループ処理が可能。
挙動としては、外側のfor文の最初の要素に対して内側のfor文が順番にループした後、外側の2番目の要素に対して内側のfor文が再度順番にループ…というのを外側・内側のfor文が終了するまで繰り返すと言うもの。
と、文字で書いても分かりにくいので1桁のかけ算で説明する。
いきなりだが、1×1から9×9まで順番に書くとこうなる。
1×1
1×2
1×3
1×4
1×5
1×6
1×7
1×8
1×9
2×1
2×2
2×3
(省略)
9×1
9×2
9×3
9×4
9×5
9×6
9×7
9×8
9×9
さて、この並びは以下のように考えることができる。
まず「かけられる数」である「1」が固定されて、その後に「かける数」である1から9まで順番にかけている。かける数の最後の数字である「9」をかけた後は、「かけられる数」が「2」に変わって、再度「かける数」である1から9まで順番にかけている。
これを繰り返し、「かけられる数・かける数」が共に9になった(9×9)になったところで1桁のかけ算が終了する。
これをプログラミングっぽく言えば「かけられる数(外側のfor文)の最初の要素に対して、かける数(内側のfor文)がループし、かける数(内側のfor文)のループが終われば、かけられる数(外側のfor文)の次の要素に対して、かける数(内側のfor文)がループする、を外・内のfor文が共に最後の要素までループすると2重ループが終了する」だ。
実際、1桁の掛け算をfor文のネストで表現するとこのようになる
for i in range(1,10): #変数iにかけられる数(1〜9)を代入
for j in range(1,10): #変数jにかける数(1〜9)を代入
print(f"{i} * {j} = {i * j}")
#1 * 1 = 1
#1 * 2 = 2
#1 * 3 = 3
#1 * 4 = 4
…
二次元配列 + for文のネストで二次元配列の要素(値)の評価ができる
number = [
[1,2,3,4,5,6,7,8,9,10],
[11,12,13,14,15,16,17,18,19,20],
[21,22,23,24,25,26,27,28,29,30]
]
二次元配列の値を順番に評価して処理したい場合…例えば値が15未満の場合は"A"を出力、値が15以上の場合は"B"を出力したい場合、まず値を順番に評価する必要がある。
値を順番に評価するには[行インデックスNo]に対して[列インデックスNo]を順番に処理(ループ)させればいい。
つまりfor 文のネストだ。
まず、行数を変数iに代入しよう。サンプルコード程度の長さであれば自力で「3行ある」と数えることができるが、ここは関数の力を借りよう。
行数や列数、文字列の長さ、要素の数を数えるにはlen()関数を使う。
print(len("この文章は何文字で出来ていますか"))
#16
len関数でカウントした行数をrangeの範囲として指定することで、行数を変数iに(順番に)代入できる。
number = [
[1,2,3,4,5,6,7,8,9,10],
[11,12,13,14,15,16,17,18,19,20],
[21,22,23,24,25,26,27,28,29,30]
]
for i in range(len(number)):
次に、列数(行の要素の数)をlen関数でカウントして変数jに代入しよう。
列数は行数にネストするのでインデントに注意する必要がある
列数は(変数名[0])でカウントできる。
number = [
[1,2,3,4,5,6,7,8,9,10],
[11,12,13,14,15,16,17,18,19,20],
[21,22,23,24,25,26,27,28,29,30]
]
for i in range(len(number)):
for j in range(len(number[0])):
この状態で「print(number[i][j])」を実行すると
number = [
[1,2,3,4,5,6,7,8,9,10],
[11,12,13,14,15,16,17,18,19,20],
[21,22,23,24,25,26,27,28,29,30]
]
for i in range(len(number)):
for j in range(len(number[0])):
print(number[i][j])
#1
#2
#3
#4
#5
#(省略)
となり、値を順番に評価できていることが分かる。
さて、今回は値が15未満の場合は"A"を、値が15以上の場合は"B"を出力してみたいと思う。ということはif文だ。
number = [
[1,2,3,4,5,6,7,8,9,10],
[11,12,13,14,15,16,17,18,19,20],
[21,22,23,24,25,26,27,28,29,30]
]
for i in range(len(number)):
for j in range(len(number[0])):
if(number[i][j]) < 15 :
print("A")
else:
print("B")
コードの答えはこのようになる。
この記事が気に入ったらサポートをしてみませんか?