情報Ⅰ プログラミング演習

第5章 配列(リスト)

この章で学べること
この章のゴール:配列とforを組み合わせたプログラムを読み書きできるようになること。共通テストのプログラミング問題は、毎回かならず配列を使った問題です。この章がこのサイト全体で最重要の章です。
目次
  1. STEP 1 値をまとめて入れる ― 配列と添字
  2. STEP 2 全部の要素を順に ― forと配列
  3. STEP 3 一番大きい値 ― 最大値と条件さがし
  4. STEP 4 番号でつながる ― 並行配列
  5. STEP 5 書きこむ ― 記録のパターン
  6. STEP 6 となりを見る ― [i-1]の技
  7. エラー例 ― よくあるエラーを知ろう!
  8. 演習問題
  9. 自由実行スペース

STEP 1値をまとめて入れる ― 配列と添字

5人分の得点を使うプログラムを書くときに tokuten1 = 5tokuten2 = 7…と5個の変数をつくるのは大変です。配列(Pythonではリストと呼びます)を使うと、tokuten = [5, 7, …] とするだけで、1つの変数にまとめて入れられます。取り出すときは tokuten[0] のように添字(番号)を指定します。番号は1からではなく0から始まることに注意してください。

kudamono 'りんご' 'みかん' 'ぶどう' [0] [1] [2]
図1 配列は「番号つきの箱の列」。番号(添字)は0から始まる
たしかめてみよう

[0] で取り出されるのがどれか、予想してから実行しましょう。[1][2] に変えて試すのもおすすめです。

確認ポイントを見る(実行してから開くこと)
[0] は先頭の「りんご」です。(図1を確認しましょう。)
len() は要素の個数(3)を教えてくれる関数で、今回は len(kudamono) = 3 を表します。ちなみに kudamono[3] と指定するとどうなるかは、エラー例1で紹介します。

例題 1

メニューと値段を2つの配列で持つ例です。同じ番号どうしが対応している(1番はパスタと200円)ことに注目してください。

ノイマン先生
いいかね、共通テストでは添字が0から始まる年と1から始まる年の両方がある(2026年は本試が1始まり、追試が0始まりだった)。問題文の冒頭に必ず「添字は0から始まる」のように書かれているから、最初にそこを確認するのが鉄則だ。
やってみよう 5-1

配列 doubutsu から「うさぎ」を添字で取り出して表示する行を書き加えなさい。

<実行結果例>うさぎ
解答例を見る(まず自分で書いてから開きましょう)
doubutsu = ['いぬ', 'ねこ', 'うさぎ', 'ハムスター']
print(doubutsu[2])
3番目だから [3]……ではなく [2]。0から数える感覚に慣れていきましょう。

STEP 2全部の要素を順に ― forと配列

配列の真価は、第4章のforと組み合わせたときに発揮されます。for i in range(len(tokuten)): と書くと、i が 0、1、2…と添字を順にたどりtokuten[i] で全要素を処理できます。これを走査(そうさ)と呼びます。

tokuten = [80, 92, 67]要素数は3(len=3)
for i in range(len(tokuten)):iが0、1、2と変わる
print(tokuten[i])[0]→[1]→[2]の順に取り出す
図2 range(len(配列)) で、添字を0から最後まで順にたどる
たしかめてみよう

添字と中身が並んで表示されることを確かめましょう。配列に得点を1つ書き足すと、forの回数も自動で増えることも試してみてください。

アラン先生
この場合 range(len(tokuten)) は  range(3) を表していて、 range(0, 3) と同じ意味ですよ!
ノイマン先生
共通テストでは len(tokuten) は 要素数(Tokuten) と表せる。len() のはたらきを知ることは共通テストでおおいに役立つのだ。

例題 2

配列の全要素を合計するプログラムです。第4章の「積み上げパターン」の、足す相手が tokuten[i] になっただけです。

アラン先生
新しいことを覚えたというより、「第4章の積み上げ」と「添字」が合体しただけなんです。むずかしく見えるプログラムも、分解すればもう知っているパターンの組み合わせ——これはこの先ずっと使える見方ですよ。
やってみよう 5-2

配列の各要素を2倍して表示する行を書き加えなさい。

<実行結果例>300 510 740
解答例を見る(まず自分で書いてから開きましょう)
num = [150, 255, 370]
for i in range(len(num)):
  print(num[i] * 2)
num[i] を「1つの数値」として、これまで通り計算に使えるのがポイントです。

STEP 3 一番大きい値  最大値と条件さがし

配列とforとifの3つがそろうと、「いちばん大きい値をさがす」ができるようになります。作戦はこうです——とりあえず先頭を暫定チャンピオンにして、全員と順に比べ、より大きい値が出たらチャンピオンを交代させる。プログラムはこの3つの要素でできています。

saikou = tokuten[0]①先頭を暫定チャンピオンに(0ではない!)
for i in range(len(tokuten)):②全員を順にたどる
if tokuten[i] > saikou:③今のチャンピオンより大きいか?
saikou = tokuten[i]大きいときだけ交代
図3 最大値さがしの3部品。ifはforの中、交代はさらにifの中

このプログラムが動く様子を、開始前から表示まで、最初から最後まで表で追ってみましょう(配列は [72, 95, 88, 61, 99] の5人とします)。チャンピオンが交代するのは、5周のうち2回だけです。

tokuten[i]saikouと比べるとsaikou
開始前先頭を暫定チャンピオンに72
1周目7272 > 72 は成り立たない72のまま
2周目9595 > 72 が成り立つ95に交代!
3周目8888 > 95 は成り立たない95のまま
4周目6161 > 95 は成り立たない95のまま
5周目9999 > 95 が成り立つ99に交代!
終了後forを抜けてprintへ99 と表示される

表からわかる大事なことが2つあります。まず、交代しない周でも、プログラムはちゃんと比べています(何も起きないのは「比べた結果、負けたから」)。そして、2周目で95に交代して決まったように見えても、最後の人までたどるから5周目の99を見のがしません。共通テストのトレース問題は、まさにこの表の1マスを聞いてきます。

たしかめてみよう

上の表とまったく同じ動きを実行して確かめましょう。そのあと、99をいちばん前に動かしても同じ答えになるか、数値を並べ替えたら交代の回数はどう変わるか、いろいろ試してみましょう。

アラン先生
次のプログラムを実行してみると、さらに何が起こっているかわかるはずです。i の値が変化するとき、どのようにプログラムが実行されているのかを理解しましょう。
たしかめてみよう

1周ごとに saikou の値を表示しています。交代した周と、しなかった周を見分けながら、上の表と見くらべてみましょう。

例題 3

「条件に合うものだけを表示する」プログラムです。配列の中から3の倍数だけを選び出します(% 3 == 0 は第2章と第3章の合わせ技です)。

ノイマン先生
いいかね、この「暫定チャンピオン交代方式」は、2025年本試(最も早く空きになる部員をさがす)でそのまま出た殿堂入りのパターンだ。2021年のサンプル問題(最大の値とその番号をさがす)も同じ考え方だった。共通テストの空欄は、たいてい「交代の条件」か「交代の中身」のどちらかだよ。
やってみよう 5-3

今度は最低点をさがします。「より小さい値が出たら交代」になるように、if文の行を書き加えなさい。

<実行結果例>最低点は 61 点
解答例を見る(まず自分で書いてから開きましょう)
tokuten = [72, 95, 88, 61]
saitei = tokuten[0]
for i in range(len(tokuten)):
  if tokuten[i] < saitei:
    saitei = tokuten[i]
print('最低点は', saitei, '点')
不等号の向きを1つ変えるだけで、最大値さがしが最小値さがしに変わります。

STEP 4番号でつながる ― 並行配列

例題1で見た「同じ番号どうしが対応する2つの配列」を、並行配列と呼びます。名前の配列と得点の配列を同じ添字 i でたどれば、「だれが何点か」を組にして扱えます。共通テストのプログラムは、ほぼ毎回この形です(到着時刻の配列と待ち時間の配列、問題番号の配列と分野の配列……)。

たしかめてみよう

1つの i が2つの配列を同時にたどっていることを確かめましょう。

やってみよう 5-4

最高得点の人の名前を表示します。最高得点の「番号」を bangou におぼえさせる行を書き加えなさい。

<実行結果例>最高点は アオイ さん
解答例を見る(まず自分で書いてから開きましょう)
namae = ['サクラ', 'ユウタ', 'アオイ']
tokuten = [85, 72, 90]
bangou = 0
for i in range(len(tokuten)):
  if tokuten[i] > tokuten[bangou]:
    bangou = i
print('最高点は', namae[bangou], 'さん')
値そのものではなく番号(添字)をおぼえておき、最後に並行配列から名前を引く——これは共通テストの記録パターン(2026年追試の Saiyou[i] = c など)そのものです。

STEP 5書きこむ ― 記録のパターン

ここまで配列は「読む」だけでしたが、要素には代入もできますtokuten[1] = 100 と書けば、1番の箱の中身が書き換わります。共通テストでは、これを使った記録のパターン——0を入れた配列を先に用意しておき、計算した結果をforで書きこんでいく形——が近年の中心です。

bai = [0, 0, 0, 0]記録用に「0が4個」の配列を用意
for i in range(4):iが0、1、2、3と変わる
bai[i] = i * 10i番の箱に結果を書きこむ
図4 記録のパターン。「0の配列を用意 → forで書きこむ」の2段構え
たしかめてみよう

代入の前後で、配列の中身が変わることを確かめましょう。書き換える番号や値も変えてみてください。

例題 4

各要素を2倍した値を、別の配列に記録するプログラムです。表示するだけだった「やってみよう5-2」との違い——結果が配列に残るので、あとから何度でも使えます。

もうひとつ大事な技があります。添字の [ ] の中には、数字だけでなく変数や配列の要素も書けます。kaisu[deme[i]] は「deme[i] 番の箱」という意味——「サイコロで3が出たら、3番の箱に1を足す」のように、出た値そのものを添字にして数えることができるのです。

ノイマン先生
いいかね、入試情報担当として断言しよう。最近の共通テストの本丸は、この「0の配列に記録していく」形なんだ。配列は読めるだけでは足りない。書きこめて、初めて得点になるのだよ。
たしかめてみよう

サイコロを6回ふった結果が deme に入っています。それぞれの目が何回出たかを、配列 kaisu に記録していきます(目が3なら kaisu[3] に1を足す)。1回ごとに kaisu の中身を表示してあるので、箱がひとつずつ埋まっていく様子を目で追ってみましょう。deme の数字を変えて、結果がどう変わるかも試してください。

アラン先生
kaisu[deme[i]] は、内側の deme[i] を先に読むのがコツです。deme[i] が3なら kaisu[3]、つまり「3番の箱」という意味になります。出た値そのものが箱の番号になる——この形は演習問題でも出てくるので、上の表示をよく見ておきましょう。

STEP 6となりを見る ― [i-1]の技

添字には計算式も書けます。a[i-1] は「iのひとつ前の要素」。「今日の売上と前日の売上の差」「自分の到着時刻と前の人の到着時刻の比較」のように、となりの要素と組にして使う形は共通テストの定番です。1つだけ注意——先頭の [0] には「前」がいないので、forは range(1, len(a))1から始めます。

例題 5

毎日の売上から、前日との増減を計算します。range(1, ...) で添字1(=2日目)から始めているところに注目してください。

やってみよう 5-5

体重の記録 kiroku について、前回からの変化(今回−前回)を順に表示する1行を書き加えなさい。

<実行結果例>2 -1 3
解答例を見る(まず自分で書いてから開きましょう)
kiroku = [50, 52, 51, 54]
for i in range(1, len(kiroku)):
  print(kiroku[i] - kiroku[i-1])
もし range(len(kiroku)) と0から始めると、最初の回で kiroku[-1](Pythonでは「いちばん最後の要素」の意味)を読んでしまい、エラーは出ないのに答えが違うという一番こわいバグになります。「[i-1]を使うforは1から」と覚えましょう。

エラー例 ― よくあるエラーを知ろう!

配列の章の定番エラーを3つ、わざと起こしてみましょう。読み方はいつも通り、いちばん最後の行からです。

エラー例 1 範囲の外の添字

要素は3つ(添字は0・1・2)なのに、[3] を取り出そうとしています。

エラーの読み方を見る(実行してから開くこと)
IndexError: list index out of range と出ます。IndexError(インデックスエラー)は「その番号の箱はありません」という意味です。要素が3つなら添字は0〜2まで。「最後の添字=要素数−1」という関係は、共通テストのループの範囲を考えるときにも効いてきます。

エラー例 2 len() のつけ忘れ

range(len(num)) と書くつもりが、range(num) になっています。

エラーの読み方を見る(実行してから開くこと)
TypeError: 'list' object cannot be interpreted as an integer と出ます。「rangeに入れるのは整数のはずなのに、リストが来た」という意味です。range(len(num)) と直せば、要素数(整数)が渡されて動きます。

エラー例 3 記録用の配列が短い

STEP 5の記録パターンで、kaisu を6個(添字0〜5)しか用意しませんでした。目の「6」が出るとどうなるでしょう。

エラーの読み方を見る(実行してから開くこと)
エラー例1と同じ IndexError: list index out of range です。目は1〜6まで出るので、添字6が使えるように7個(添字0〜6)必要でした。記録パターンでは「記録される値の最大はいくつか → 配列は何個必要か」を最初に確かめるのがコツです。

演習問題

問 5-1

配列の要素を合計し、さらに平均も表示するプログラムを完成させなさい。ヒント:平均は 合計 ÷ 要素数 です。

<実行結果例>合計は 2592 平均は 518.4
解答例を見る(まず自分で書いてから開きましょう)
num = [150, 255, 370, 890, 927]
goukei = 0
for i in range(len(num)):
  goukei = goukei + num[i]
print('合計は', goukei)
print('平均は', goukei / len(num))
len(num) で割るのがポイントです。要素数を5と直接書くより、あとから配列が増えてもそのまま動く良いプログラムになります。
問 5-2

配列 num = [150, 255, 370, 890, 927] の要素のうち、3の倍数だけを数えて、いくつあるかを表示するプログラムを完成させなさい。ヒント:数えるための変数を0から積み上げます。

<実行結果例>3の倍数は 3 個
解答例を見る(まず自分で書いてから開きましょう)
num = [150, 255, 370, 890, 927]
kosuu = 0
for i in range(len(num)):
  if num[i] % 3 == 0:
    kosuu = kosuu + 1
print('3の倍数は', kosuu, '個')
「条件に合ったら + 1」で数える——このカウントパターンは、2026年追試(分野ごとの採用問題数を数える Mondaisu[b] = Mondaisu[b] + 1)でそのまま出題されました。
問 5-3

1週間の最高気温の配列から、いちばん高い気温をさがして表示するプログラムを自分で考えて作りなさい(「暫定チャンピオン交代方式」をゼロから書いてみましょう)。

<実行結果例>今週の最高気温は 34 度
解答例を見る(まず自分で書いてから開きましょう)
kion = [28, 31, 34, 30, 27, 33, 29]
saikou = kion[0]
for i in range(len(kion)):
  if kion[i] > saikou:
    saikou = kion[i]
print('今週の最高気温は', saikou, '度')
これがゼロから書けたら、共通テストの最大値問題の空欄は得点源です。
問 5-4(発展)

文化祭の売店の売上を計算します。値段の配列と売れた個数の配列(並行配列)から、売上の合計金額を求めるプログラムを自分で考えて作りなさい。ヒント:i番の売上は 値段[i] × 個数[i] です。

<実行結果例>売上の合計は 13000 円
解答例を見る(まず自分で書いてから開きましょう)
nedan = [150, 200, 250]
kosuu = [20, 30, 16]
uriage = 0
for i in range(len(nedan)):
  uriage = uriage + nedan[i] * kosuu[i]
print('売上の合計は', uriage, '円')
並行配列×積み上げの合わせ技です。2026年本試の待ち行列計算も、複数の配列を同じ i でたどるこの形でした。ここまで書けたら、共通テストのプログラムの骨組みはもう読めます。
問 5-5

生徒6人の所属クラス(0組・1組・2組)が配列 kumi に入っています。各クラスの人数を配列 ninzu に記録する1行を書き加えなさい(STEP 5の記録パターンです)。

<実行結果例>[2, 3, 1]
解答例を見る(まず自分で書いてから開きましょう)
kumi = [1, 0, 2, 1, 1, 0]
ninzu = [0, 0, 0]
for i in range(len(kumi)):
  ninzu[kumi[i]] = ninzu[kumi[i]] + 1
print(ninzu)
STEP 5のサイコロと同じ形だと気づけたでしょうか。「集計表を配列で作る」——この1行が書ければ、記録のパターンは卒業です。

自由実行スペース

思いついたことを自由に試すための場所です。自分の1週間の勉強時間を配列にして、合計や最高記録を求めてみるのもおすすめです。

ノイマン先生
ちなみに共通テストの表記では、配列は Tokuten = [80, 92, 67] のように大文字で始まる名前で書かれ、要素数は 要素数(Tokuten) という関数で取る。Pythonの len() と同じ働きだ。
実行環境を準備中…