はじめに
やあ、こんにちは。今日は『2次元リスト』についてやっていこう。
はい、よろしくお願いします。『2次元リスト』は初めて聞く言葉ですね。
うむ、ヒロトはエクセルを使ったことあるかい?
はい、『表計算ソフト』はとても便利です。
今回は、エクセルで行う表計算のような計算を、プログラムを書いて実行することが目的だぞ。
へー楽しみですね!
以前、第8回で『リスト』について学んだが、リストの要素がリストになっているものを『2次元リスト』という。
リストの各要素がリストになっているものですか?
うーむ・・・
2次元リストの具体例
なかなかイメージがわかないだろう?例えば、生徒番号が 0、1、2、3、4 の5人の生徒が国語、数学、理科、社会、英語の5教科のテストを受けたという状況を考えよう。その結果以下のような結果になったとする。
教科→ 番号↓ | 国語 | 数学 | 理科 | 社会 | 英語 |
0 | 61 | 70 | 67 | 55 | 68 |
1 | 72 | 81 | 75 | 70 | 78 |
2 | 68 | 65 | 61 | 83 | 80 |
3 | 79 | 54 | 58 | 85 | 91 |
4 | 81 | 97 | 91 | 78 | 93 |
こうような状況を表現するとき『2次元リスト』を用いるのだ。この表をプログラムで書くと次のようになる。
上のプログラムでは、『score(=点数)』という変数に2次元リストが代入されている。リストは[ ]で囲んで表したが、[ ]の中にまた[ ]で囲まれた要素が入っていることが見て取れるだろう?
はい。[ ]の中の各リストが生徒の5教科の得点を表しているのですね!
そういうことだ。
上のプログラムに続けて次のように書こう。
リストを用いたfor文の書き方
問題を出す前に、新しいことを説明しよう。
まず、8行目で変数 x に生徒番号をキーボードから入力することはいいだろう。そして、10行目のfor文で『range(回数)』と書く場所に『score[x]』が書かれているだろう?これについてだが、例えば x=1 のとき score[1] はリストscore の中の1番目の要素を表す。今回の場合、score[1]=[72,81,75,70,78] である。ここまでいいかな?
はい、x に代入する番号は0から4までということでいいのですね。
そういうことだ。では次にfor文について説明しよう。
今回のfor文はこれまで使ってきた『for i in range(回数)』の形ではなく、『for i in リスト』の形となっている。こうすることによって指定されたリストの要素を繰返して実行することができる。例えば score[1] を指定した場合、score[1] の要素が1つずつfor文の変数 i に代入され、12行目の s=s+i によって変数 s に足されていくわけだ。これで新しい内容の説明は以上だ。このことを踏まえて、このプログラムを実行するとどうなるか考えてほしい。
はい、変数 s は、はじめ0が代入されていて、リストscore[1] の要素が次々に足されていくことになるので、s は生徒番号1の生徒の5教科の合計点が代入されます。よって、実行結果は、72+81+75+70+78=376 が表示されます。
答え合わせはいつも通り自分で実行して確認してごらん。
はい。今回は『file36』から書いていきます。
はい、しっかり合ってました!
sum関数を用いて行の和を求める
うむ。第8回でも紹介したが、sum関数を使えば次のように生徒の合計点を求めることができるぞ。9行目を見てほしい。
sum(リスト) でリスト内の数値を足してくれるのでしたね。
では、sum関数を用いて5人の合計点を順番に表示するプログラムを書いてみて欲しい。そして、それら5人分の点数の合計を新しいリスト『goukei』に追加していき、最後に最高点の生徒をmax関数を用いて表示してみてくれ。必要であれば第8回の『値を追加する』を復習してほしい。
はい、『file37』にリストscoreをコピペしてから考えます。リストに値を追加するには、まず空のリスト『goukei=[] 』を用意するのでした。そして、このリストの末尾に要素を追加するには『 (リスト名).append(要素) 』の形にするのでしたね。
できました!9行目で空のリスト『goukei』を用意して、for文において11行目で各生徒の5教科の合計点を変数 s に代入し、12行目でリスト『goukei』にそれら合計点を追加しています。13行目で合計点をすべて追加したリスト『goukei』を表示しています。最後の14行目でリスト『goukei』の中の最高点を表示するようにしました。
完璧だ!
今回は各生徒の合計点を求めたが、次は教科ごとの合計点を求めてみよう。つまり、国語の合計点や数学の合計点を求めるということだ。このプログラムを書くために必要となる知識があるからまずはそれを説明しよう。
はい、お願いします。
縦の列の和を求める
先ほどの2次元リストscoreにおいて、例えば score[0][1] は『生徒番号0番の1番目の教科(数学)』を表す。つまり、下のように70という得点を表すのだ。教科の番号も0番から数えることに注意してくれ。
なるほど、つまり『 score[生徒番号][教科番号] 』という形で2次元リストの中の任意の要素を表すことができるのですね!そして、番号はいずれも0から数える。
そういうことだ。この説明を理解すれば先ほどの問題にも答えられるようになる。では改めて『数学の合計点』を求めるプログラムを書いてみよう。新しく『file38』を用意してくれ。
はい!数学ということは教科番号は1なのでfor文を使って足し合わせることを考えると…
できました!9行目でキーボードから教科番号を変数 j に代入できるようにしました。そして、生徒番号の方は for文 を用いて0番から4番まで順番に変数 i に代入します。結果、変数 s に score[0][1]+score[1][1]+score[2][1]+score[3][1]+score[4][1] が代入されることになります。
最後の難問
素晴らしい!
けっこう難しいと思ったが、よくできたな!
では、本日最後の問題だ。先ほどと同様に各教科の合計点を求め、一番合計点が高い教科を表示するプログラムを書いてみよう。これはかなり難しいからたっぷり時間をかけて考えてほしい。
はい、file38のプログラムをfile39にコピペして考えます。
長い格闘の末・・・
ふう、なんとかできました!
この問題はかなり考えました。
9行目と10行目二つの空のリストを作りました。そして、for文の2重ループを用いて、13行目でkyouka のリストには縦の列の点数を追加していき、14行目で無事に入ったか一度表示させています。15行目で各教科の合計点を変数 s に代入し、16行目でそれを goukei のリストに追加しています。そして、17行目で kyouka のリストをリセットしました。これをしないと教科の合計がどんどん足されてしまうことに気づいたのです。このことに気づくのにかなりかかりましたが、試行錯誤していくうちにきっとこういう事なんだろうと気づきました!
うむ!本当に難しい問題だったがよく自力で倒してくれたな!
いろいろと試行錯誤できるということは、自分で考えられるだけの知識と技術が身についてきた証拠でもあるぞ!さて、今日はここまでにしよう、本当にお疲れさん。
はい、ありがとうございました!
コメント