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")
     

コードの答えはこのようになる。


この記事が気に入ったらサポートをしてみませんか?