くり返しとデータの持ち方

INPUT · スライド

辞書とリストで持ち直す

01 / 07

番号で引くか、名前で引くか

入れ物が2つあると、どちらを使うか迷う。目安はこれだよ。

  • 同じ種類のものを並べるならリスト。「点数を5件」「くだものを3つ」
  • 1つのものの項目をまとめるなら辞書。「名前と値段と個数」

前のレッスンでは、名前・値段・個数を3本のリストに分けて持った。あれは本当は1件ぶんのまとまりを、むりやりバラバラにしていたんだ。

02 / 07

1件を辞書にする

1件ぶんを辞書にすると、名前と値段がはなれない。番号を合わせる必要もなくなるよ。

取り出すときは [] の中にキーを書く。番号ではなく名前なので、並び順を気にしなくていい。

shina = {"namae": "パン", "nedan": 160}print(shina["namae"])print(shina["nedan"])

実行結果

パン
160

03 / 07

辞書をリストに並べる

そして、その辞書をリストに並べる。これが現実のデータのいちばんふつうの形だよ。名簿も、商品一覧も、注文の履歴も、たいていこの形をしている。

くり返しをかければ、3件でも1000件でも同じコードで処理できる。ここがこの章のゴールだ。

kago = [{"namae": "パン", "nedan": 160}, {"namae": "のり", "nedan": 220}]for shina in kago:    print(shina["namae"])

実行結果

パン
のり

04 / 07

1件を変数に受ける

shina["namae"] を何度も書くと読みにくい。取り出した値に名前をつけておくと、ぐっと読みやすくなるよ。

とくに f 文字列の中では {shina["namae"]} とクォートが重なって書きづらい。先に変数で受けておけば、その悩みも消える。

shina = {"namae": "パン", "nedan": 160, "kosuu": 2}namae = shina["namae"]shoukei = shina["nedan"] * shina["kosuu"]print(f"{namae} {shoukei}円")

実行結果

パン 320円

05 / 07

無いかもしれない項目

辞書に無いキーを [] で引くと KeyError になって止まってしまう。あるか分からないなら in か get を使おう。

  • if "zaiko" in shina: … あるかどうかを尋ねる
  • shina.get("zaiko", 0) … 無ければ 0 を返してもらう

現実のデータは項目が欠けていることがある。欠けていても止まらないように書けると強いよ。

shina = {"namae": "のり"}print(shina.get("zaiko", 0))

実行結果

0

06 / 07

数えるときは辞書に足しこむ

「どれが何個あるか」を数えるときは、空の辞書を外に置いて、まわしながら足しこむ。

はじめて出たキーはまだ辞書に無いので、in で見て 1 を入れる。2回目からは += 1 する。この形はそのまま覚えてしまっていいよ。

kudamonos = ["りんご", "みかん", "りんご"]kazoe = {}for kudamono in kudamonos:    if kudamono in kazoe:        kazoe[kudamono] += 1    else:        kazoe[kudamono] = 1print(kazoe)

実行結果

{'りんご': 2, 'みかん': 1}

07 / 07

ここから先は部品にする

入れ物とくり返しがそろうと、たいていのデータ処理は書けるようになる。あとは同じ処理を何度も書かない工夫だけだ。

次の章では、ひとまとまりの処理に名前をつけて呼び出せるようにする。この章で書いた集計にも名前がついて、いつでも使える部品になるよ。

その前に、10問で仕上げよう。