プログラミング演習・14章版 第6章 リストとデータ構造
教材コード

リストと基本的なデータ構造

これまでの章では,1つの変数に1つの値を代入してきた.たとえば tensuu = 85 のように,変数 tensuu には点数を1つだけ入れて いた.しかし,実際に扱いたいデータは1つだけとはかぎりません.クラス全員の テストの点数,1週間ぶんの気温の記録,名簿に並んだ名前など,たくさんの 値をまとめて扱いたい場面はとても多いです.

もし40人ぶんの点数を変数1つずつで持とうとすると,tensuu1, tensuu2,…,tensuu40 と40個の変数が必要になり, 平均を求めるだけでも大変な手間になります.そこでこの章では,複数の値を 順番に並べて1つの名前で扱うしくみであるリストを学ぶ. リストを使えるようになると,「たくさんのデータを集計する」というプログラミングの 得意分野が,一気に身近になります.

リストとは何か

たとえば,買い物のレシートを思いうかべてください.レシートには商品名や値段が 上から順番に並んでいます.あるいは,運動会のプログラムには競技が 順番に書かれています.このように「順番に並んだもの」を,紙の上ではなく プログラムの中で持つしくみがリストです.

リストとは,複数の値を順番に並べて,1つの名前でまとめて 扱うためのデータです.Python では,値を半角のカンマ , で区切り, 全体を半角の角カッコ [\ ](ブラケット)で囲んで作ります.次の例を見てみましょう.

chapter-06_code_1.py
# 5人ぶんのテストの点数をリストにまとめる
tensuu = [85, 72, 90, 68, 100]

# リストをそのまま画面に表示する
print(tensuu)

これを実行すると,次のように表示されます.

実行結果の例
[85, 72, 90, 68, 100]

[85, 72, 90, 68, 100] の部分がリストです.角カッコの中に,5つの値が カンマで区切られて並んでいます.この1つ1つの値を要素(エレメント)と よぶ.ここでは要素は5個あります.そして,このリスト全体に tensuu という 1つの名前(変数)を付けた.これ以降は tensuu と書くだけで,5人ぶんの 点数の集まりをまとめて指し示すことができます.

リストには数値だけでなく,文字列を並べることもできます.たとえば名簿(名前の 一覧)は,文字列のリストで表せる.

chapter-06_code_3.py
# クラスの名前を並べたリスト(文字列のリスト)
namae = ["佐藤", "鈴木", "田中", "高橋"]
print(namae)
実行結果の例
['佐藤', '鈴木', '田中', '高橋']

文字列の要素は,画面に表示されるときシングルクォート '\ ' で囲まれて 出ます.プログラムを書くときはダブルクォート "\ " で統一すればよいが, print で表示すると Python はシングルクォートで見せる,という点だけ 知っておけばよいでしょう.どちらも同じ文字列を表しています.

リストを作る角カッコ [\ ] と,値を区切るカンマ , は,すべて 半角で入力します.全角の「[ ]」や「,」を使うとエラーになります.また, 要素が文字列のときはそれぞれをクォートで囲む(["佐藤", "鈴木"]). [佐藤, 鈴木] のようにクォートを忘れると,名前を変数だと勘違いされて エラーになります.

  • リストは複数の値を順番に並べて1つの名前で扱うしくみです.

  • 角カッコ [\ ] の中に,値をカンマ , で区切って並べて作ります.

  • リストの中の1つ1つの値を要素といいます.数値でも文字列でも並べられます.

順番のある値をまとめる

知識

リストは複数の値を順番付きでまとめます。角括弧で囲み、要素をカンマで区切ります。

tensuu = [85, 72, 90, 68, 100]
print(tensuu)
そのまま演習順番のある値をまとめる

実行前に、表示される行数と各行の値を予想してください。上のコードを編集欄へ開き、変更せずに実行します。その後「出力例」を開き、予想と実行結果を比べてください。入力操作はありません。各表示行の末尾には改行があります。

出力例
[85, 72, 90, 68, 100]
ヒントを見る

リストの要素数と、値が並ぶ順番を予想してください。リスト全体を表示する場合は、括弧や区切りも出力に現れます。

演習の解説

5個の整数を持つリストが表示されます。値の順序も保存されるので、最初の要素は85です。

虫食い順番のある値をまとめる

___の1か所だけを補い、上と同じ結果が出るコードにしてください。他の行は変えません。

tensuu = ___85, 72, 90, 68, 100]
print(tensuu)
ヒントを見る

リストの始まりと終わりの括弧は対です。値の区切りはその括弧の内側に置きます。

虫食いの解説
tensuu = [85, 72, 90, 68, 100]
print(tensuu)

空欄には [ が入ります。5個の整数を持つリストが表示されます。値の順序も保存されるので、最初の要素は85です。

要素と添字:0から始まる番号

リストの中の特定の要素を取り出したいことがあります.「3番目の点数を知りたい」と いった場合です.そのためにリストの各要素には,先頭から順番に番号が ふられています.この番号を添字(インデックス)とよぶ.

ここで,プログラミングを始めた人がほぼ全員つまずく,とても大事な約束があります. 添字は 1 ではなく 0 から始まるのである(図6.1).つまり, 先頭の要素の添字は 0,2番目が 1,3番目が 2,…となります.

リスト tensuu と添字(添字は0から始まる)

要素を取り出すには,リスト名のうしろに角カッコを付け,その中に添字を書きます. tensuu[0] と書けば,添字 0 の要素(先頭の要素)が取り出せます.

chapter-06_code_5.py
tensuu = [85, 72, 90, 68, 100]

print(tensuu[0])    # 先頭の要素(添字は0)
print(tensuu[2])    # 3番目の要素(添字は2)
print(tensuu[4])    # 5番目の要素(添字は4)
実行結果の例
85
90
100

tensuu[0] が先頭の 85,tensuu[2] が3番目の 90, tensuu[4] が5番目(最後)の 100 です.「3番目なら添字は2」と いうように,番目より1つ小さい数が添字になる,と覚えるとよいでしょう.

要素の値は,取り出したあとふつうの値と同じように計算に使えます.たとえば 先頭の点数と3番目の点数の差を求めるなら,取り出した2つの要素を引き算すれば よいでしょう.

chapter-06_code_7.py
tensuu = [85, 72, 90, 68, 100]

# 先頭と3番目の点数の差を求める
sa = tensuu[2] - tensuu[0]
print("差は", sa, "点")
実行結果の例
差は 5 点

tensuu[2] は 90,tensuu[0] は 85 なので,その 差は 5 です.このように リスト[添字] は,1つの値として そのまま式の中に書けます.添字で取り出した要素は,もう「リストの一部」では なく,ただの数値(や文字列)として扱える,と考えるとよいでしょう.

要素の個数を知る:len()

リストの中に要素がいくつあるかは,関数 len(レン, length の略)で調べられます.カッコの中にリストを渡すと,要素の個数を返します.

chapter-06_code_9.py
tensuu = [85, 72, 90, 68, 100]

ninzuu = len(tensuu)        # 要素の個数を数える
print("人数は", ninzuu, "人")
実行結果の例
人数は 5 人

要素が5個あるので len(tensuu) は 5 を返し,それを変数 ninzuu に代入しました.ここで重要なのは,要素は5個でも,添字は 0から4までだという点です.いちばん大きい添字は,個数より1つ 小さい len(tensuu) - 1 になります.

このことを使うと,要素が何個あっても末尾の要素を確実に取り出せます. 末尾の添字は「個数 − 1」だから,len(リスト) - 1 を添字に書けばよいでしょう.

chapter-06_code_11.py
tensuu = [85, 72, 90, 68, 100]

saigo = len(tensuu) - 1     # 末尾の添字(5-1で4)
print("末尾の点数は", tensuu[saigo])
実行結果の例
末尾の点数は 100

len(tensuu) - 1 は 4 になり,tensuu[4] すなわち末尾の 100 が取り出せた.末尾の添字を 4 と直接書いてもよいが, len(リスト) - 1 と書いておけば,要素が増えても減っても「いつでも 末尾」を指せる.要素の個数が変わるリストでは,この書き方が安全です.

添字の最大は「個数 − 1」です.要素が5個のリストで tensuu[5] と 書くと,添字 5 の要素は存在しないため,IndexError(インデックスエラー) というエラーになります.「5個あるから [5] まで使える」と勘違いしやすいので 注意します.使える添字は [0] から [4] までです.

  • 添字は 0 から始まる.先頭が [0],n 番目は [$n-1$].

  • リスト[添字] で,その位置の要素を取り出せます.

  • len(リスト) で要素の個数がわかります.最大の添字は「個数 − 1」.

先頭と最後の要素を取り出す

知識

添字は0から始まります。先頭から何番目かと添字の値を混同しないようにします。

tensuu = [85, 72, 90, 68, 100]
print(tensuu[0])
print(tensuu[4])
そのまま演習先頭と最後の要素を取り出す

実行前に、表示される行数と各行の値を予想してください。上のコードを編集欄へ開き、変更せずに実行します。その後「出力例」を開き、予想と実行結果を比べてください。入力操作はありません。各表示行の末尾には改行があります。

出力例
85
100
ヒントを見る

先頭を起点に添字を書き添え、指定された位置の値を取り出します。要素の順番と添字の値のずれに注意してください。

演習の解説

添字0は先頭の85、添字4は5番目の100です。5要素のリストへ添字5でアクセスすると範囲外になります。

虫食い先頭と最後の要素を取り出す

___の1か所だけを補い、上と同じ結果が出るコードにしてください。他の行は変えません。

tensuu = [85, 72, 9___, 68, 100]
print(tensuu[0])
print(tensuu[4])
ヒントを見る

何番目の要素かと添字の値は1だけずれます。先頭につく番号から数えてください。

虫食いの解説
tensuu = [85, 72, 90, 68, 100]
print(tensuu[0])
print(tensuu[4])

空欄には 0 が入ります。添字0は先頭の85、添字4は5番目の100です。5要素のリストへ添字5でアクセスすると範囲外になります。

要素の書きかえと追加

リストは,作ったあとから中身を変えることができます.間違って入力した点数を 直したり,あとから新しいデータを足したりできます.

要素を書きかえる

ある要素を別の値にしたいときは,リスト[添字] = 新しい値 のように, 取り出すときと同じ書き方の左側に代入します.

chapter-06_code_13.py
tensuu = [85, 72, 90, 68, 100]

tensuu[1] = 80          # 添字1の要素を72から80に書きかえる
print(tensuu)
実行結果の例
[85, 80, 90, 68, 100]

tensuu[1] = 80 によって,添字 1 の要素が 72 から 80 に 入れかわった.ほかの要素はそのまま残っています.このように,リストは一部だけを あとから変更できます.

書きかえる右側には,計算式を書いてもよいでしょう.たとえば身長の記録のうち1つを 0.5 だけ増やす(測り直して伸びていた)なら,いまの値に 0.5 を 足したものを,同じ場所へ代入し直します.

chapter-06_code_15.py
shinchou = [158.0, 162.5, 170.0]

shinchou[1] = shinchou[1] + 0.5     # 添字1の値を0.5だけ増やす
print(shinchou)
実行結果の例
[158.0, 163.0, 170.0]

shinchou[1] + 0.5 は,いまの 162.5 に 0.5 を足した 163.0 です.その結果をふたたび shinchou[1] へ代入したので, 添字1の要素だけが更新されました.右側でいったんいまの値を取り出し,計算して, 左側の同じ場所へ書き戻す,という流れです.

要素を追加する:append()

リストの末尾に新しい要素を1つ加えるには,append(アペンド, 「付け加える」の意味)を使います.リスト名.append(値) と書きます.

chapter-06_code_17.py
tensuu = [85, 72, 90]      # 最初は3人ぶん
print("追加前", tensuu)

tensuu.append(68)          # 末尾に68を追加する
print("追加後", tensuu)
実行結果の例
追加前 [85, 72, 90]
追加後 [85, 72, 90, 68]

append を使うたびに,要素はリストの末尾に1つずつ加わって いく(図6.2).要素の個数も1つ増える.

append で末尾に要素が追加されるようす

append は,あとで学ぶ「空のリストから始めて,繰り返しで1つずつ データをためていく」という使い方でとても役に立つ.空のリストは [] と 書く(要素が0個のリスト).

chapter-06_code_19.py
kekka = []                 # 空のリストを用意する
kekka.append("合格")       # 1つ目を追加
kekka.append("不合格")     # 2つ目を追加
print(kekka)
実行結果の例
['合格', '不合格']

append は リスト名.append(値) のように,リスト名のうしろに ピリオド . を付けて呼ぶ.append(tensuu, 68) のように書くのは 誤りです.また,tensuu = tensuu.append(68) と代入してしまうと, tensuu が空っぽ(None)になってしまう.append は リスト自身を直接書きかえるので,代入し直す必要はありません.tensuu.append(68) とだけ書けばよいでしょう.

  • リスト[添字] = 値 で,その位置の要素を書きかえられます.

  • リスト名.append(値) で,末尾に要素を1つ追加できます.

  • 空のリスト [] から始めて,append でためていける.

書き換えと末尾への追加を比べる

知識

添字への代入は既存要素を書き換え、appendは末尾に新しい要素を1個追加します。

tensuu = [85, 72, 90]
tensuu[1] = 80
tensuu.append(68)
print(tensuu)
そのまま演習書き換えと末尾への追加を比べる

実行前に、表示される行数と各行の値を予想してください。上のコードを編集欄へ開き、変更せずに実行します。その後「出力例」を開き、予想と実行結果を比べてください。入力操作はありません。各表示行の末尾には改行があります。

出力例
[85, 80, 90, 68]
ヒントを見る

書き換えの後のリストを一度書き出し、次に追加の操作を行います。要素数が変わるのはどちらの操作かを確認します。

演習の解説

2番目の72が80になり、最後へ68が追加されます。結果は[85, 80, 90, 68]です。

虫食い書き換えと末尾への追加を比べる

___の1か所だけを補い、上と同じ結果が出るコードにしてください。他の行は変えません。

tensuu = [85, 72, 90]
tensuu[1] = 80
tensuu.___(68)
print(tensuu)
ヒントを見る

既存の位置への代入は要素数を増やしません。末尾へ新しい要素を加えるメソッドを使います。

虫食いの解説
tensuu = [85, 72, 90]
tensuu[1] = 80
tensuu.append(68)
print(tensuu)

空欄には append が入ります。2番目の72が80になり、最後へ68が追加されます。結果は[85, 80, 90, 68]です。

forでリストを1つずつ処理する

リストの本当の便利さは,全部の要素に同じ処理を順番に行うときに 発揮されます.第5章で学んだ繰り返し(for)と リストを組み合わせると,要素を1つずつ取り出して処理できます.

要素を1つずつ取り出す

for 変数 in リスト: と書くと,リストの先頭から末尾まで,要素が1つずつ 変数に代入され,そのたびにブロックの中身が実行されます.

chapter-06_code_21.py
tensuu = [85, 72, 90, 68, 100]

# 要素を1つずつ取り出して表示する
for t in tensuu:
    print("点数は", t)
実行結果の例
点数は 85
点数は 72
点数は 90
点数は 68
点数は 100

1回目の繰り返しでは t に 85 が,2回目では 72 が,… というように,要素が順番に t へ代入されます.添字を自分で数えなくても, リストの全要素をもれなく処理できるのが for の強みです.

合計と平均を求める

リストの要素を合計するには,0 から始めた変数に,繰り返しの中で要素を 足し込んでいく.これは集計の基本パターンです.

chapter-06_code_23.py
tensuu = [85, 72, 90, 68, 100]
goukei = 0                      # 合計を入れる変数を0で用意

for t in tensuu:
    goukei = goukei + t         # 取り出した点数を足していく

heikin = goukei / len(tensuu)   # 合計を人数で割る
print("合計は", goukei, "点")
print("平均は", heikin, "点")
実行結果の例
合計は 415 点
平均は 83.0 点

goukei を最初に 0 にしておき,繰り返しのたびに要素を足して いく.すべて足し終えたら,len(tensuu) で求めた人数で割って平均を 出します.人数を直接 5 と書かず len(tensuu) を使えば,要素が 増えても同じプログラムがそのまま使えます.

最高点を自分で探す

合計のほかに,「いちばん大きい値」を求めたいこともあります.これも for で 書けます.考え方は,いままで見た中でいちばん大きい値を1つの変数に 覚えておき,それより大きい要素が出てきたら覚え直す,というものです.

chapter-06_code_25.py
tensuu = [85, 72, 90, 68, 100]
saidai = tensuu[0]              # まず先頭を「仮の最大」とする

for t in tensuu:
    if t > saidai:             # いまの最大より大きければ
        saidai = t             # 覚え直す
print("最高点は", saidai)
実行結果の例
最高点は 100

最初に saidai を先頭の要素 85 にしておく.そのあと1つずつ 取り出して,saidai より大きい要素が来たら saidai を更新します. 90 が来たときに 85 から 90 へ,100 が来たときに 100 へと更新され,最後に最高点 100 が残る.最小を求めるなら, 比較を < に変えればよいでしょう.

最大を探す変数 saidai を,うっかり 0 で始めてはいけない場面が あります.たとえば気温に氷点下(マイナスの値)が混じると,すべての要素が 0 より小さく,最大が正しく求まらないことがあります.先頭の要素を仮の最大に する(saidai = tensuu[0])のが安全です.

合計・最大・最小は関数でも書ける

合計・最大・最小は,とてもよく使うので Python に専用の関数が用意されています. sum(サム,合計),max(マックス,最大),min(ミン, 最小)です.リストを渡すだけで結果が返る.

chapter-06_code_27.py
tensuu = [85, 72, 90, 68, 100]

goukei = sum(tensuu)            # 合計
saidai = max(tensuu)            # 最大(最高点)
saishou = min(tensuu)           # 最小(最低点)
print("合計", goukei, "最高", saidai, "最低", saishou)
実行結果の例
合計 415 最高 100 最低 68

sum を使えば,さきほど for で書いた合計の処理を1行で書けます. 平均は sum(tensuu) / len(tensuu) で求められます.for のしくみを 理解したうえで,ふだんはこうした便利な関数を使うとよいでしょう.

for t in tensuu: の t には要素そのもの(点数の値)が 入ります.添字(0,1,2,…)ではない点に注意します.「番号がほしい」と思うかも しれないが,合計や平均のように全要素を順に処理するだけなら,添字は 使わずに要素を直接受け取るこの書き方が読みやすい.

  • for 変数 in リスト: で要素を1つずつ取り出して処理できます.

  • 合計は「0から始めて足し込む」のが基本.平均は合計÷個数.

  • sum max min len で集計を手早く書けます.

各要素の値を表示する

知識

forでリストを直接回すと、添字ではなく各要素の値が順に変数へ入ります。

tensuu = [85, 72, 90]
for t in tensuu:
    print(t)
そのまま演習各要素の値を表示する

実行前に、表示される行数と各行の値を予想してください。上のコードを編集欄へ開き、変更せずに実行します。その後「出力例」を開き、予想と実行結果を比べてください。入力操作はありません。各表示行の末尾には改行があります。

出力例
85
72
90
ヒントを見る

各回でループ変数へ入る要素の値を順に記録します。リスト全体を1回表示する場合との違いを予想してください。

演習の解説

85、72、90を別々の行へ表示します。tが各回の点数そのものなので、さらに添字で取り出す必要はありません。

虫食い各要素の値を表示する

___の1か所だけを補い、上と同じ結果が出るコードにしてください。他の行は変えません。

tensuu = [85, 72, 90]
for t ___ tensuu:
    print(t)
ヒントを見る

ループの変数と対象のリストを結ぶキーワードを考えます。行末のコロンと、その下の字下げは残してください。

虫食いの解説
tensuu = [85, 72, 90]
for t in tensuu:
    print(t)

空欄には in が入ります。85、72、90を別々の行へ表示します。tが各回の点数そのものなので、さらに添字で取り出す必要はありません。

アンケートの集計:丸の数を数える

リストと繰り返しを組み合わせる練習として,アンケートの集計をやってみましょう. ある質問に「はい」と答えた人を "○",そうでない人を "×" として リストに記録したとします.「はい」が何人いるかを数えるには,要素を1つずつ調べ, "○" のときだけ数える変数を1ふやせばよいでしょう.条件分岐(第4章)と 繰り返しの組み合わせです.

chapter-06_code_29.py
kaitou = ["○", "×", "○", "○", "×", "○"]
kaisuu = 0                      # 「○」の個数を数える変数

for k in kaitou:
    if k == "○":                # 要素が「○」なら
        kaisuu = kaisuu + 1     # 1ふやす

print("「○」は", kaisuu, "人")
実行結果の例
「○」は 4 人

for で回答を1つずつ k に取り出し,k == "○" が 成り立つときだけ kaisuu を1ふやしています.このように「ある条件に 合う要素だけを数える」処理は,集計でとてもよく使うパターンです.比較は ==(等しいか)であって =(代入)ではない点に,あらためて 注意してください.

  • 「条件に合う要素を数える」は,0から始めた変数を if の中で 1ふやすのが定石です.

  • リスト・繰り返し・条件分岐を組み合わせると,集計が自在にできます.

該当する回答だけを数える

知識

数える処理では、条件を満たしたときだけ件数を1増やします。件数と合計値は異なる変数です。

kaitou = ["○", "×", "○", "○"]
kazu = 0
for k in kaitou:
    if k == "○":
        kazu = kazu + 1
print(kazu)
そのまま演習該当する回答だけを数える

実行前に、表示される行数と各行の値を予想してください。上のコードを編集欄へ開き、変更せずに実行します。その後「出力例」を開き、予想と実行結果を比べてください。入力操作はありません。各表示行の末尾には改行があります。

出力例
3
ヒントを見る

回答を1個ずつ調べ、条件を満たした回だけ件数を増やします。全回答の数と、対象の件数を分けて考えてください。

演習の解説

4回答のうち○が3個なので3を表示します。×のときには件数を増やさないため、全回答数4にはなりません。

虫食い該当する回答だけを数える

___の1か所だけを補い、上と同じ結果が出るコードにしてください。他の行は変えません。

kaitou = ["○", "×", "○", "○"]
kazu = 0
for k in kaitou:
    if k ___ "○":
        kazu = kazu + 1
print(kazu)
ヒントを見る

回答が対象の記号と一致する場合だけ件数を増やします。代入でなく、真偽を求める比較が必要です。

虫食いの解説
kaitou = ["○", "×", "○", "○"]
kazu = 0
for k in kaitou:
    if k == "○":
        kazu = kazu + 1
print(kazu)

空欄には == が入ります。4回答のうち○が3個なので3を表示します。×のときには件数を増やさないため、全回答数4にはなりません。

スライス:一部だけ取り出す

リストから1つの要素ではなく,連続したいくつかの要素をまとめて 取り出したいこともあります.「最初の3人だけ」「3人目から後ろだけ」といった 場合です.これにはスライスという書き方を使います. リスト[開始:終了] と,添字を半角コロン : ではさんで書きます.

chapter-06_code_31.py
tensuu = [85, 72, 90, 68, 100]

print(tensuu[0:3])      # 添字0から2まで(最初の3つ)
print(tensuu[2:5])      # 添字2から4まで
実行結果の例
[85, 72, 90]
[90, 68, 100]

ここでも0始まりと同じく,少し注意がいます.tensuu[0:3] は,添字 0,1,2の要素を取り出し,終了に書いた3は含まない.「開始は 含み,終了は含まない」と覚えます.取り出される個数は「終了 − 開始」になる ([0:3] なら 3 − 0 = 3 個).

開始や終了は省略できます.省略すると,それぞれ「先頭から」「末尾まで」の意味に なります.

chapter-06_code_33.py
tensuu = [85, 72, 90, 68, 100]

print(tensuu[:2])       # 先頭から添字1まで(最初の2つ)
print(tensuu[3:])       # 添字3から末尾まで
実行結果の例
[85, 72]
[68, 100]

tensuu[:2] は先頭から,tensuu[3:] は末尾までを取り出します. スライスの結果は,もとのリストの一部を取り出した新しいリストです.

スライスの終了の添字は含まれない.tensuu[0:3] は添字 0,1,2 の3つで,添字3の要素は入りません.「3まで」と思って tensuu[0:3] と書くと,欲しかった4つ目が抜けることがあります.含めたいなら終了を1つ大きく します.

  • リスト[開始:終了] で連続した要素をまとめて取り出せます.

  • 開始は含み,終了は含みません.個数は「終了 − 開始」.

  • 開始・終了は省略でき,それぞれ「先頭から」「末尾まで」を表します.

指定した区間だけ切り出す

知識

スライスの開始位置は含み、終了位置は含みません。元のリストから一部の新しいリストを作ります。

tensuu = [85, 72, 90, 68, 100]
print(tensuu[1:4])
そのまま演習指定した区間だけ切り出す

実行前に、表示される行数と各行の値を予想してください。上のコードを編集欄へ開き、変更せずに実行します。その後「出力例」を開き、予想と実行結果を比べてください。入力操作はありません。各表示行の末尾には改行があります。

出力例
[72, 90, 68]
ヒントを見る

開始位置から終了位置の直前まで、対象となる添字を並べます。取り出さない端の要素も確認してください。

演習の解説

添字1、2、3の値を取り出して[72, 90, 68]になります。添字4の100は含みません。

虫食い指定した区間だけ切り出す

___の1か所だけを補い、上と同じ結果が出るコードにしてください。他の行は変えません。

tensuu = [85, 72, 90, 68, 100]
print(tensuu[___])
ヒントを見る

開始位置は含み、終了位置は含みません。欲しい3要素の添字を書き出してみてください。

虫食いの解説
tensuu = [85, 72, 90, 68, 100]
print(tensuu[1:4])

空欄には 1:4 が入ります。添字1、2、3の値を取り出して[72, 90, 68]になります。添字4の100は含みません。

sorted()で並べかえる

リストの要素を小さい順(昇順)に並べかえたいことがあります.たとえば気温の記録を 低い順に見たい,点数を低い順に並べたい,といった場合です.これには sorted(ソーテッド,「並べかえた」の意味)という関数を使います.リストを 渡すと,並べかえた新しいリストを返します.

chapter-06_code_35.py
kion = [22, 18, 25, 20, 19]     # ある5日間の気温の記録

narabi = sorted(kion)           # 小さい順に並べかえる
print("もとの記録", kion)
print("並べかえ後", narabi)
実行結果の例
もとの記録 [22, 18, 25, 20, 19]
並べかえ後 [18, 19, 20, 22, 25]

sorted(kion) は,気温を小さい順に並べた新しいリストを返し,それを narabi に代入しました.もとの kion はそのまま変わっていない点に 注目してください.大きい順(降順)に並べたいときは,reverse=True を 付けて sorted(kion, reverse=True) と書きます.文字列のリストなら, 五十音やアルファベット順に並べかえられます.

sorted は新しいリストを返す関数なので,結果を変数で受け取る 必要があります.sorted(kion) とだけ書いても,もとの kion は 並べかわりません.narabi = sorted(kion) のように,必ず代入して結果を 受け取ること.

  • sorted(リスト) は小さい順に並べた新しいリストを返します.

  • もとのリストは変わりません.結果は変数で受け取ります.

  • reverse=True を付けると大きい順になります.

元の順序を保って並べ替える

知識

sortedは並べ替えた新しいリストを返します。元のリストはそのままです。

tensuu = [85, 72, 90]
print(sorted(tensuu))
print(tensuu)
そのまま演習元の順序を保って並べ替える

実行前に、表示される行数と各行の値を予想してください。上のコードを編集欄へ開き、変更せずに実行します。その後「出力例」を開き、予想と実行結果を比べてください。入力操作はありません。各表示行の末尾には改行があります。

出力例
[72, 85, 90]
[85, 72, 90]
ヒントを見る

並べ替えて得られる結果と、元の変数が指すリストを別々に追ってください。2回の表示が同じ順序になるかを予想します。

演習の解説

最初は[72, 85, 90]、次は元の[85, 72, 90]を表示します。sortedの結果を代入していないため元の順序は変わりません。

虫食い元の順序を保って並べ替える

___の1か所だけを補い、上と同じ結果が出るコードにしてください。他の行は変えません。

tensuu = [85, 72, 90]
print(___(tensuu))
print(tensuu)
ヒントを見る

新しい並べ替え結果を返す関数を選びます。元のリスト自体の順序が変わる操作と区別してください。

虫食いの解説
tensuu = [85, 72, 90]
print(sorted(tensuu))
print(tensuu)

空欄には sorted が入ります。最初は[72, 85, 90]、次は元の[85, 72, 90]を表示します。sortedの結果を代入していないため元の順序は変わりません。

辞書:名前と値の対応表

リストは「順番」でデータを並べるしくみでした.しかし,世の中には 名前で引きたいデータも多いです.たとえば「田中さんの点数は?」のように, 番号ではなく名前から値を探したいことがあります.これには,リストとは 別のデータ構造である辞書(ディクショナリ, dict)が向いています.

辞書は,国語辞典が「言葉」から「意味」を引けるように,キー(名前)と 値を対応づけて持つ「対応表」です.波カッコ {\ }(ブレース)の 中に,キー: 値 の組をカンマで区切って並べて作ります.

chapter-06_code_37.py
# 名前(キー)と点数(値)の対応表
tensuu = {"田中": 90, "鈴木": 72, "佐藤": 85}

print(tensuu["田中"])       # キー「田中」で値を引く
print(tensuu["佐藤"])
実行結果の例
90
85

リストでは tensuu[0] のように添字(番号)で取り出したが, 辞書では tensuu["田中"] のようにキー(名前)で取り出します. 番号を覚えていなくても,名前さえわかれば値を引けるのが辞書の便利な点です.

あとからキーと値の組を追加するのも簡単で,辞書[新しいキー] = 値 と 書きます.

chapter-06_code_39.py
tensuu = {"田中": 90, "鈴木": 72}

tensuu["高橋"] = 68         # 新しい対応を追加する
print(tensuu)
実行結果の例
{'田中': 90, '鈴木': 72, '高橋': 68}

すでにあるキーに対して 辞書[キー] = 値 と書くと,こんどは追加 ではなく,その値の書きかえになります.キーがすでにあるかないかで, 追加か変更かが自動的に決まる.

chapter-06_code_41.py
tensuu = {"田中": 90, "鈴木": 72}

tensuu["田中"] = 95         # すでにある「田中」の値を書きかえる
print(tensuu)
実行結果の例
{'田中': 95, '鈴木': 72}

「田中」というキーはすでにあるので,新しく増えるのではなく,値が 90 から 95 に入れかわった.リストの リスト[添字] = 値 が書きかえ だったのと同じ感覚で,辞書ではキーを指定して書きかえられます.

辞書も for で1つずつ処理できます.for キー in 辞書: と書くと, キーが順番に取り出されます.取り出したキーで 辞書[キー] と書けば, 対応する値も得られます.

chapter-06_code_43.py
tensuu = {"田中": 90, "鈴木": 72, "佐藤": 85}

# キーを1つずつ取り出し,名前と点数を表示する
for namae in tensuu:
    print(namae, "さんは", tensuu[namae], "点")
実行結果の例
田中 さんは 90 点
鈴木 さんは 72 点
佐藤 さんは 85 点

繰り返しのたびに namae へキー(名前)が入り,tensuu[namae] で その人の点数を引いています.名前と値がペアになったデータを,全員ぶん順番に 処理できるのです.

辞書は,名簿と点数,商品名と値段,都市名と気温のように,「名前と値がペアに なっているデータ」を扱うときに力を発揮します.ここでは「名前で値を引ける 対応表がある」ということを知っておけば十分です.くわしい使い方は, 必要になったときに学べばよいでしょう.

辞書のキーで値を取り出すとき,存在しないキーを指定すると KeyError (キーエラー)になります.たとえば上の辞書で tensuu["山田"] と書くと, 「山田」というキーがないためエラーになります.また,リストの [\ ](角カッコ)と 辞書の {\ }(波カッコ)を取りちがえないよう注意します.

  • 辞書は「キー(名前)」と「値」を対応づけて持つ対応表です.

  • 波カッコ {\ } の中に キー: 値 を並べて作ります.

  • 辞書[キー] で値を引く.辞書[キー] = 値 で追加・変更します.

  • for キー in 辞書: で,キーを1つずつ取り出して処理できます.

この章では,複数のデータをまとめて扱うリストと,名前で値を引く辞書を学んだ. リストと繰り返し・条件分岐を組み合わせれば,たくさんのデータを集計する プログラムが書けます.次の章では,こうしたデータをファイルから読み込んで 集計する方法を学ぶ.これで,実際のアンケートや記録のデータを扱えるように なっていく.

名前を手掛かりに点数を探す

知識

辞書は位置ではなくキーで値を取り出します。キーと値をコロンで結びます。

scores = {"佐藤": 72, "鈴木": 88}
print(scores["鈴木"])
そのまま演習名前を手掛かりに点数を探す

実行前に、表示される行数と各行の値を予想してください。上のコードを編集欄へ開き、変更せずに実行します。その後「出力例」を開き、予想と実行結果を比べてください。入力操作はありません。各表示行の末尾には改行があります。

出力例
88
ヒントを見る

辞書の中で指定した名前に対応する値を探します。名前が何番目に書かれているかではなく、対応関係に注目してください。

演習の解説

キー「鈴木」に対応する値88を表示します。リストの添字と違い、この辞書では名前が値を探す手掛かりです。

虫食い名前を手掛かりに点数を探す

___の1か所だけを補い、上と同じ結果が出るコードにしてください。他の行は変えません。

scores = {"佐藤": 72, "___": 88}
print(scores["鈴木"])
ヒントを見る

辞書の角括弧に入れるのは、点数を探したい人の名前です。値そのものや位置番号ではありません。

虫食いの解説
scores = {"佐藤": 72, "鈴木": 88}
print(scores["鈴木"])

空欄には 鈴木 が入ります。キー「鈴木」に対応する値88を表示します。リストの添字と違い、この辞書では名前が値を探す手掛かりです。

図で理解する

リストと添字
リストと添字
辞書で値を探す
辞書で値を探す

練習して確かめる

章末演習(10問)

ここには解答を載せていません。

  1. 章末演習章末演習 1

    リスト numbers の末尾に,append を使って値を1つずつ追加し,追加後のリストを表示します。

    入力

    入力なし(input() は使わない)。プログラムの最初で numbers = [2, 4] と書いてリストを用意します。

    処理条件

    • numbers.append(...) を2回使い,6,8 の順に末尾へ追加します。
    • numbers = [2, 4, 6, 8] と書き直すこと,+ による連結,extend,insert は使いません。
    • 繰り返し(for・while)は使いません。

    出力

    • 1行だけ表示します。リストは print(リスト名) で表示したときのPython標準の形式([ ] で囲み,要素の区切りは半角カンマと半角空白1個)。
    • 数字・記号はすべて半角。
    • 見出しや説明文は表示しません。

    実行例

    入力なし

    出力(プログラムが表示する内容)

    [2, 4, 6, 8]
    
    ヒントを見る

    まず最初のリストを作り,次に「どの値をどの順で末尾に足すか」を考えます。表示は追加がすべて終わってから1回だけ行います。

  2. 章末演習章末演習 2

    キーボードから入力した3つの整数をリスト numbers にまとめ,リスト全体と先頭の要素を表示します。

    入力

    整数を3つ,1行に1つずつ,計3行入力する(負の数や0も入力されうる)。input() には案内文を付けない(input() と書く)。

    処理条件

    • 3つの値を int() で整数に変換してから,入力した順にリスト numbers を作ります。
    • 先頭の要素は添字(インデックス)を使って numbers から取り出します。入力を受け取った変数をそのまま表示してはいけません。
    • 繰り返しは使いません。

    出力

    • 2行表示します。
    • リスト全体(print(リスト名) で表示したときのPython標準の形式。[ ] で囲み,要素の区切りは半角カンマと半角空白1個)
    • 先頭の要素(整数のみ)
    • 数字・記号はすべて半角。
    • キーボードから入力した値は出力に含めない(入力欄に表示されるだけで,プログラムの出力ではない)。見出し・説明文・空行など,指定以外の表示はしません。

    実行例

    入力(キーボードから入力する値)

    10
    20
    30
    

    出力(プログラムが表示する内容)

    [10, 20, 30]
    10
    

    実行例2

    入力(キーボードから入力する値)

    -5
    0
    7
    

    出力(プログラムが表示する内容)

    [-5, 0, 7]
    -5
    
    ヒントを見る

    リストの添字が何番から始まるかを確認してから,先頭を指す添字を決めましょう。整数に変換し忘れると,リストの表示に `'` が付きます。

  3. 章末演習章末演習 3

    キーボードから入力した3つの文字列をリスト words にまとめ,負の添字を使って後ろから要素を取り出して表示します。

    入力

    英単語などの文字列を3つ,1行に1つずつ,計3行入力します。input() には案内文を付けない(input() と書く)。

    処理条件

    • 入力した順にリスト words を作ります。
    • 最後の要素と最後から2番目の要素は,負の添字(マイナスの番号)を使って words から取り出します。words[2] のような正の添字や len による計算は使いません。
    • 繰り返しは使いません。

    出力

    • 3行表示します。
    • リスト全体(print(リスト名) で表示したときのPython標準の形式。[ ] で囲み,要素の区切りは半角カンマと半角空白1個,各文字列は ' で囲まれる)
    • 最後の要素(' は付けない)
    • 最後から2番目の要素(' は付けない)
    • 大文字・小文字は入力のとおりに表示します。
    • 記号はすべて半角。
    • キーボードから入力した値は出力に含めない(入力欄に表示されるだけで,プログラムの出力ではない)。見出し・説明文・空行など,指定以外の表示はしません。

    実行例

    入力(キーボードから入力する値)

    apple
    banana
    orange
    

    出力(プログラムが表示する内容)

    ['apple', 'banana', 'orange']
    orange
    banana
    
    ヒントを見る

    後ろから数えるとき,最後の要素がどの負の番号に当たるかを先に確かめます。そこから1つ前へ進むと番号がどう変わるかを考えましょう。

  4. 章末演習章末演習 4

    キーボードから入力した4つの文字列をリスト items にまとめ,len で要素の個数を求めて表示します。

    入力

    文房具の名前などの文字列を4つ,1行に1つずつ,計4行入力します。input() には案内文を付けない(input() と書く)。

    処理条件

    • 入力した順にリスト items を作ります。
    • 要素の個数は len(items) で求めます。4 と直接書いたり,自分で数えたりしません。
    • 繰り返しは使いません。

    出力

    • 2行表示します。
    • リスト全体(print(リスト名) で表示したときのPython標準の形式。[ ] で囲み,要素の区切りは半角カンマと半角空白1個,各文字列は ' で囲まれる)
    • 要素数: に続けて半角空白1個,個数(「要素数」は全角,: は半角コロン,個数は半角数字)
    • キーボードから入力した値は出力に含めない(入力欄に表示されるだけで,プログラムの出力ではない)。見出し・説明文・空行など,指定以外の表示はしません。

    実行例

    入力(キーボードから入力する値)

    pen
    book
    eraser
    ruler
    

    出力(プログラムが表示する内容)

    ['pen', 'book', 'eraser', 'ruler']
    要素数: 4
    
    ヒントを見る

    まずリストを完成させ,次にリストの長さを調べる関数を使います。2行目は文字列と数値を並べて表示するので,区切りの空白が1個になる書き方を選びましょう。

  5. 章末演習章末演習 5

    キーボードから入力した整数でリスト numbers の2番目の要素を書き換え,変更前と変更後のリストを表示します。

    入力

    整数を4つ,1行に1つずつ,計4行入力します。最初の3つがリストの要素,4つ目が2番目の要素に入れる新しい値(負の数も入力されうる)。input() には案内文を付けない(input() と書く)。

    処理条件

    • 最初の3つの整数で,入力順にリスト numbers を作ります。
    • 4つ目の整数は,添字を指定した代入(numbers[添字] = 値)で2番目の要素に入れます。リストを [a, x, c] のように作り直したり,insert・pop・remove を使ったりしません。
    • 要素の個数は3個のまま変わりません。

    出力

    • 2行表示します。
    • 変更前のリスト
    • 変更後のリスト
    • リストは print(リスト名) で表示したときのPython標準の形式([ ] で囲み,要素の区切りは半角カンマと半角空白1個)。
    • 数字・記号はすべて半角。
    • キーボードから入力した値は出力に含めない(入力欄に表示されるだけで,プログラムの出力ではない)。見出し・説明文・空行など,指定以外の表示はしません。

    実行例

    入力(キーボードから入力する値)

    1
    2
    3
    9
    

    出力(プログラムが表示する内容)

    [1, 2, 3]
    [1, 9, 3]
    
    ヒントを見る

    「2番目」が添字ではいくつに当たるかを先に決めます。変更前のリストは,書き換えより前に表示しておく必要があります。

  6. 章末演習章末演習 6

    空のリスト numbers から始め,キーボードから入力した整数を1つずつ append で追加し,追加するたびにリストを表示して,リストが伸びていく様子を確かめる。

    入力

    整数を3つ,1行に1つずつ,計3行入力します。input() には案内文を付けない(input() と書く)。

    処理条件

    • プログラムの最初で numbers = [] と書き,空のリストを用意します。
    • 「1つ入力する → numbers.append(...) で末尾に追加する → リストを表示する」を3回行います。
    • [a, b, c] のようにリストをまとめて作ること,+ による連結,extend・insert は使いません。
    • 繰り返し(for・while)は使わず,3回分を順に書きます。

    出力

    • 3行表示します。各行は,その時点のリスト全体。
    • リストは print(リスト名) で表示したときのPython標準の形式([ ] で囲み,要素の区切りは半角カンマと半角空白1個)。
    • 数字・記号はすべて半角。
    • キーボードから入力した値は出力に含めない(入力欄に表示されるだけで,プログラムの出力ではない)。見出し・説明文・空行など,指定以外の表示はしません。

    実行例

    入力(キーボードから入力する値)

    1
    2
    3
    

    出力(プログラムが表示する内容)

    [1]
    [1, 2]
    [1, 2, 3]
    
    ヒントを見る

    「入力・追加・表示」の3つを1組とし,その組を3回並べる形を考えます。表示の位置を追加の直後にすると,途中のリストの様子が見えます。

  7. 章末演習章末演習 7

    キーボードから入力した3人の名前をリスト names にまとめ,for 文でリストの要素を先頭から順に取り出して,1人ずつあいさつ文を表示します。

    入力

    名前(文字列)を3つ,1行に1つずつ,計3行入力します。input() には案内文を付けない(input() と書く)。

    処理条件

    • 入力した順にリスト names を作ります。
    • for 変数 in names: の形で要素を1つずつ取り出します。繰り返しの中の print は1つだけにします。
    • names[0] のように添字で個別に取り出すこと,range で添字を回すことはしません。

    出力

    • 3行表示します。各行は こんにちは、 に続けて名前,最後に さん。
    • 「こんにちは、」の読点 、 は全角。名前の前後に空白は入れません。
    • 名前の大文字・小文字は入力のとおり。リスト全体は表示しません。
    • キーボードから入力した値は出力に含めない(入力欄に表示されるだけで,プログラムの出力ではない)。見出し・説明文・空行など,指定以外の表示はしません。

    実行例

    入力(キーボードから入力する値)

    Alice
    Bob
    Carol
    

    出力(プログラムが表示する内容)

    こんにちは、Aliceさん
    こんにちは、Bobさん
    こんにちは、Carolさん
    
    ヒントを見る

    繰り返しのたびに変数へどの値が入るかを,1回目・2回目・3回目と順に書き出してみましょう。空白を入れずにつなぐには,`print` の区切り方に注意します。

  8. 章末演習章末演習 8

    キーボードから入力した整数 n について,空のリストに 1 から n までの整数を for 文と append で順に追加し,できたリストを表示します。

    入力

    0以上20以下の整数 n を1つ,1行で入力します。input() には案内文を付けない(input() と書く)。

    処理条件

    • プログラムの中で numbers = [] と書き,空のリストを用意します。
    • for 文と range で 1 から n までの整数を順に作り,numbers.append(...) で1つずつ追加します。
    • list(range(...)),内包表記([i for i in ...]),extend は使いません。
    • n が 0 のときは何も追加しない(空のリストのまま)。

    出力

    • 1行だけ表示します。リストは print(リスト名) で表示したときのPython標準の形式([ ] で囲み,要素の区切りは半角カンマと半角空白1個)。
    • n が 0 のときは [] と表示します。
    • 数字・記号はすべて半角。
    • キーボードから入力した値は出力に含めない(入力欄に表示されるだけで,プログラムの出力ではない)。見出し・説明文・空行など,指定以外の表示はしません。

    実行例

    入力(キーボードから入力する値)

    5
    

    出力(プログラムが表示する内容)

    [1, 2, 3, 4, 5]
    

    実行例2(境界値)

    入力(キーボードから入力する値)

    0
    

    出力(プログラムが表示する内容)

    []
    
    ヒントを見る

    `range` の終わりの値が含まれるかどうかを確かめ,n まで入れるには何を渡せばよいかを考えます。表示は繰り返しの外に置きましょう。

  9. 章末演習章末演習 9

    7人分のテストの点数のリストについて,for 文で1つずつ足し込んで合計を求め,平均とあわせて表示します。

    入力

    入力なし(input() は使わない)。プログラムの最初で tensuu = [72, 85, 68, 90, 100, 83, 77] と書いてリストを用意します。

    処理条件

    • 合計をためる変数を goukei = 0 で用意し,for 変数 in tensuu: で取り出した点数を1つずつ足し込む。
    • sum(),statistics などのモジュール,numpy などの外部ライブラリは使いません。
    • 平均は合計を len(tensuu) で割って求めます。四捨五入や round はせず,/ の計算結果をそのまま表示します。

    出力

    • 2行表示します。
    • 合計は,半角空白1個,合計,半角空白1個,点
    • 平均は,半角空白1個,平均,半角空白1個,点
    • 「合計は」「平均は」「点」は全角,数値は半角。
    • 見出しや説明文は表示しません。

    実行例

    入力なし

    出力(プログラムが表示する内容)

    合計は 575 点
    平均は 82.14285714285714 点
    
    ヒントを見る

    繰り返しの前に置くもの・中に置くもの・後に置くものを分けて考えます。`for` で取り出される変数に入るのは添字か要素かを確かめましょう。表示は合計が完成してから行います。

  10. 章末演習章末演習 10

    1週間の最高気温のリストから,20度以上だった日の数を数え,その日の気温だけを集めた新しいリストも作って表示します。

    入力

    入力なし(input() は使わない)。プログラムの最初で kion = [18, 22, 25, 19, 30, 21, 17] と書いてリストを用意します。

    処理条件

    • 個数を数える変数を kaisuu = 0,集めるリストを takai = [] で用意します。
    • for 変数 in kion: と if を使います。気温が20以上(20ちょうどを含む)のときだけ,kaisuu を1増やし,その気温を takai.append(...) で追加します。
    • 内包表記,filter,sum は使いません。個数は len(takai) ではなく kaisuu で数える。

    出力

    • 2行表示します。
    • 20度以上の日は,半角空白1個,個数,半角空白1個,日(「度以上の日は」「日」は全角,数字は半角)
    • 集めたリスト(print(リスト名) で表示したときのPython標準の形式。[ ] で囲み,要素の区切りは半角カンマと半角空白1個,元のリストと同じ順)
    • 見出しや説明文は表示しません。

    実行例

    入力なし

    出力(プログラムが表示する内容)

    20度以上の日は 4 日
    [22, 25, 30, 21]
    
    ヒントを見る

    条件に合ったときだけ行う処理が2つあることに注目し,それらを `if` の中にそろえます。「以上」が比較演算子のどれに当たるか,表示を繰り返しの内と外のどちらに置くかも確かめましょう。