リストと基本的なデータ構造
これまでの章では,1つの変数に1つの値を代入してきた.たとえば tensuu = 85 のように,変数 tensuu には点数を1つだけ入れて いた.しかし,実際に扱いたいデータは1つだけとはかぎりません.クラス全員の テストの点数,1週間ぶんの気温の記録,名簿に並んだ名前など,たくさんの 値をまとめて扱いたい場面はとても多いです.
もし40人ぶんの点数を変数1つずつで持とうとすると,tensuu1, tensuu2,…,tensuu40 と40個の変数が必要になり, 平均を求めるだけでも大変な手間になります.そこでこの章では,複数の値を 順番に並べて1つの名前で扱うしくみであるリストを学ぶ. リストを使えるようになると,「たくさんのデータを集計する」というプログラミングの 得意分野が,一気に身近になります.
リストとは何か
たとえば,買い物のレシートを思いうかべてください.レシートには商品名や値段が 上から順番に並んでいます.あるいは,運動会のプログラムには競技が 順番に書かれています.このように「順番に並んだもの」を,紙の上ではなく プログラムの中で持つしくみがリストです.
リストとは,複数の値を順番に並べて,1つの名前でまとめて 扱うためのデータです.Python では,値を半角のカンマ , で区切り, 全体を半角の角カッコ [\ ](ブラケット)で囲んで作ります.次の例を見てみましょう.
# 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人ぶんの 点数の集まりをまとめて指し示すことができます.
リストには数値だけでなく,文字列を並べることもできます.たとえば名簿(名前の 一覧)は,文字列のリストで表せる.
# クラスの名前を並べたリスト(文字列のリスト) 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 の要素(先頭の要素)が取り出せます.
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つの要素を引き算すれば よいでしょう.
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 の略)で調べられます.カッコの中にリストを渡すと,要素の個数を返します.
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 を添字に書けばよいでしょう.
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でアクセスすると範囲外になります。
要素の書きかえと追加
リストは,作ったあとから中身を変えることができます.間違って入力した点数を 直したり,あとから新しいデータを足したりできます.
要素を書きかえる
ある要素を別の値にしたいときは,リスト[添字] = 新しい値 のように, 取り出すときと同じ書き方の左側に代入します.
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 を 足したものを,同じ場所へ代入し直します.
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(値) と書きます.
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個のリスト).
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つずつ 変数に代入され,そのたびにブロックの中身が実行されます.
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 から始めた変数に,繰り返しの中で要素を 足し込んでいく.これは集計の基本パターンです.
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つの変数に 覚えておき,それより大きい要素が出てきたら覚え直す,というものです.
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(ミン, 最小)です.リストを渡すだけで結果が返る.
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から始めて足し込む」のが基本.平均は合計÷個数.
summaxminlenで集計を手早く書けます.
各要素の値を表示する
知識
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章)と 繰り返しの組み合わせです.
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人目から後ろだけ」といった 場合です.これにはスライスという書き方を使います. リスト[開始:終了] と,添字を半角コロン : ではさんで書きます.
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 個).
開始や終了は省略できます.省略すると,それぞれ「先頭から」「末尾まで」の意味に なります.
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(ソーテッド,「並べかえた」の意味)という関数を使います.リストを 渡すと,並べかえた新しいリストを返します.
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)が向いています.
辞書は,国語辞典が「言葉」から「意味」を引けるように,キー(名前)と 値を対応づけて持つ「対応表」です.波カッコ {\ }(ブレース)の 中に,キー: 値 の組をカンマで区切って並べて作ります.
# 名前(キー)と点数(値)の対応表
tensuu = {"田中": 90, "鈴木": 72, "佐藤": 85}
print(tensuu["田中"]) # キー「田中」で値を引く
print(tensuu["佐藤"])90 85
リストでは tensuu[0] のように添字(番号)で取り出したが, 辞書では tensuu["田中"] のようにキー(名前)で取り出します. 番号を覚えていなくても,名前さえわかれば値を引けるのが辞書の便利な点です.
あとからキーと値の組を追加するのも簡単で,辞書[新しいキー] = 値 と 書きます.
tensuu = {"田中": 90, "鈴木": 72}
tensuu["高橋"] = 68 # 新しい対応を追加する
print(tensuu){'田中': 90, '鈴木': 72, '高橋': 68}すでにあるキーに対して 辞書[キー] = 値 と書くと,こんどは追加 ではなく,その値の書きかえになります.キーがすでにあるかないかで, 追加か変更かが自動的に決まる.
tensuu = {"田中": 90, "鈴木": 72}
tensuu["田中"] = 95 # すでにある「田中」の値を書きかえる
print(tensuu){'田中': 95, '鈴木': 72}「田中」というキーはすでにあるので,新しく増えるのではなく,値が 90 から 95 に入れかわった.リストの リスト[添字] = 値 が書きかえ だったのと同じ感覚で,辞書ではキーを指定して書きかえられます.
辞書も for で1つずつ処理できます.for キー in 辞書: と書くと, キーが順番に取り出されます.取り出したキーで 辞書[キー] と書けば, 対応する値も得られます.
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
リスト
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
キーボードから入力した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つの文字列をリスト
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
キーボードから入力した整数でリスト
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番目」が添字ではいくつに当たるかを先に決めます。変更前のリストは,書き換えより前に表示しておく必要があります。
- 最初の3つの整数で,入力順にリスト
- 章末演習章末演習 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
キーボードから入力した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
キーボードから入力した整数 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
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
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` の中にそろえます。「以上」が比較演算子のどれに当たるか,表示を繰り返しの内と外のどちらに置くかも確かめましょう。
- 個数を数える変数を