どうも!リョクちゃです。
前回は、リストの中のリスト、多次元配列(中でも2次元配列)について紹介しました。
いきなり数学チックな内容且つ拙い説明になってしまって……
筆者がもっと学ばねばと感じた次第です。
さて、今日は前回の内容から多次元配列の中身についてそれぞれ処理を行いたい場合、
どうしたらいいのか?といった点について紹介していきます。
前回の記事はこちらをご参照
目次
前回の振り返り
主題に入る前に、前回の振り返りを行っていきます。
行列をPythonで書く
下のような例をコードで書く場合は、
このようにして書くことができました。
図1 3行3列の多次元配列
1 2 3 4 5 |
lstX = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] print(lstX) # 出力 # [[1, 2, 3], [4, 5, 6], [7, 8, 9]] |
多次元配列の中身を取得
多次元配列の任意の値を取得したい場合は、下のようにして書くことができました。
リスト変数[行][列] = 要素(※行と列が交差する値)
たとえば 、図1の3行3列の多次元配列から2を取り出したい場合、
リスト変数[0][1] = 2
1 2 3 4 5 6 7 |
lstX = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] print(lstX) print(lstX[0][1]) # 出力 # [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # 2 |
多次元配列の中身についてそれぞれ処理をしたい
それでは、図1の3行3列の多次元配列を例に解説していきます。
まず、多次元配列の中身についてそれぞれ処理をしていくうえでループ処理を使います。
ループ処理については、以前の記事でまとめていますのでそちらをご参照ください。
多次元配列の場合、ループ処理でも2重ループといった処理を使っていきます。
2重ループとは、ループ処理の後に別のループ処理が書かれている処理をいいます。
形で表すと、下のようになります。
1 2 3 |
# 2重ループ for <変数> in <反復可能オブジェクト>: for <変数> in <反復可能オブジェクト>: |
この2重ループを使って、多次元配列の中身について
それぞれ処理をさせていくことができます。
考え方としては、
この考え方を2重ループの形に当てはめてみると,
1 2 3 |
# 多次元配列の中身についてそれぞれ処理 for <行> in <2次元配列の行数>: for <列> in <行>: |
こんな感じになります。
実際にコードに書いてみると、
1 2 3 4 |
# 2重ループ lstX = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] for i in lstX: for j in i: |
①
②
このように流れを表すことができます。
それぞれprint関数を使って出力をしてみると、下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
lstX = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] for i in lstX: print('処理行 : %s' % i) for j in i: print('値 : %s' % j) print() # 出力 # 処理行 : [1, 2, 3] # 値 : 1 # 値 : 2 # 値 : 3 # 処理行 : [4, 5, 6] # 値 : 4 # 値 : 5 # 値 : 6 # 処理行 : [7, 8, 9] # 値 : 7 # 値 : 8 # 値 : 9 |
行列っぽく出力してみる
多次元配列内のそれぞれの値について出力をすることはできましたが、
出力する際に、行列っぽく出力させたいなんてこともあるかもしれません。
そんなときは下のようにして書きます。
1 2 3 4 5 6 7 8 9 10 |
lstX = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] for i in lstX: for j in i: print(j, end=" ") print() # 出力 # 1 2 3 # 4 5 6 # 7 8 9 |
2番目のループでprint関数に対して、end=” “を付加しています。
これを記述することで、通常print関数を使用した場合は、改行されるのに対して
半角スペースを末尾に加えています。
endのように引数を指定して代入を行うような変数を“キーワード変数”といいます。
print関数において、endは省略もでき、省略をした場合は末尾に改行が付加されます。
print関数が空の場合は、改行のみを表しています。
実際に綺麗に出力ができていて、行列っぽくなったのがわかると思います。
こだわるとprint関数でアスキーアートも作れるかも!!
……配列を駆使すれば、より効率よく……?
練習問題
① 下図のような3行4列の多次元配列があります。
それぞれの値を出力してください。※形式は自由です。
まとめ
多次元配列内の値についてそれぞれ処理をしていく場合は、
2重ループを使う。
1 2 3 |
# 2重ループ for <変数> in <反復可能オブジェクト>: for <変数> in <反復可能オブジェクト>: |
おわりに
多次元配列を扱えるようになると、スキルの幅が大幅に向上されます。
基礎だけでも覚えておけば、ある程度かけるようになった頃には、
自然に使えるようになっているかもしれません。
2次元配列ぐらいまでは、書けるようになっておきましょう。
より高度な配列になっていくと、手に負えないので、
これはまた別の方法を駆使して書いていく手法があります。
(Numpyといった外部ライブラリになります。
たしか数学演算用(行列演算に特化)のライブラリだったかな。)
これからも学びを続けて、ためになれるよう
読者の方や悩めるPython初心者の方に共有できたらなと思ってます!