持ち戻りは何件ありましたか
大阪の物流会社で、配送の事務を始めたとします。朝、課長から「昨日の持ち戻りは何件だった?」と聞かれました。
配送記録は、1日で3000行あります。一行ずつ目で数えるのは無理です。
Pythonを数行書けば、答えはすぐに出ます。
このレッスンのゴール
メモ
Pythonで、表のデータの行を読んで、条件に合う行だけを取り出すことができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 行 | 一件分の記録です。 | |
| 列 | どの行にもある項目です。 | area |
| 辞書 | 名前と値を組にして持つ入れ物です。 | {"area": "北区"} |
| 辞書のリスト | 表全体です。一行が一つの辞書です。 | |
| 絞り込み | 条件に合う行だけを残すことです。 |
学生が入力するセルは、このプレビューでは空白です。
一行は一つの辞書です
表計算ソフトの画面を思い出してください。いちばん上に列の名前が並び、その下に一件ずつ行が続きます。
Pythonでは、一行を辞書で表します。列の名前がキーで、そこに値が入ります。
表全体は、辞書を並べたリストです。deliveries[0] は1行目で、deliveries[0]["area"] は1行目の地区です。
名前は英語で書きます
ヒント
変数やキーの名前は、英語で書きます。多くの職場で、そう決めています。どの国の人が読んでも分かるからです。画面に出す文字は、日本語のままで大丈夫です。
一行と一つの値を読む
# 配送記録の1行は、1つの辞書です。列の名前がキーになります。
deliveries = [
{"id": "D-101", "area": "北区", "weight_kg": 3, "status": "配達済み"},
{"id": "D-102", "area": "浪速区", "weight_kg": 12, "status": "持ち戻り"},
{"id": "D-103", "area": "北区", "weight_kg": 7, "status": "配達中"},
]
print("行の数:", len(deliveries))
print("1行目の伝票番号:", deliveries[0]["id"])
print("1行目の地区:", deliveries[0]["area"])
# 最後の行を書きかえて、3行目の状態を表示してみましょう。
print("2行目の重さ:", deliveries[1]["weight_kg"], "kg")
同じ配送記録を、一つずつ読む
| Python | 意味 | 値 |
|---|---|---|
| len(deliveries) | 行の数 | 3 |
| deliveries[0] | 1行目 | D-101 の記録全体 |
| deliveries[0]["area"] | 1行目の地区 | 北区 |
| deliveries[2]["weight_kg"] | 3行目の重さ | 7 |
学生が入力するセルは、このプレビューでは空白です。
for と if で行を絞り込みます
絞り込むときは、行を一つずつ順番に見ます。この役目は for 文です。
ループの中で、if 文が行を調べます。条件に合えば、append で新しいリストに入れます。
ループが終わると、新しいリストには欲しい行だけが残ります。件数は len で数えます。
持ち戻りだけを取り出す
deliveries = [
{"id": "D-101", "area": "北区", "weight_kg": 3, "status": "配達済み"},
{"id": "D-102", "area": "浪速区", "weight_kg": 12, "status": "持ち戻り"},
{"id": "D-103", "area": "北区", "weight_kg": 7, "status": "配達中"},
{"id": "D-104", "area": "淀川区", "weight_kg": 2, "status": "持ち戻り"},
{"id": "D-105", "area": "北区", "weight_kg": 15, "status": "持ち戻り"},
]
# 条件に合う行だけを、新しいリストに入れます。
returned = []
for row in deliveries:
if row["status"] == "持ち戻り":
returned.append(row)
for row in returned:
print(row["id"], row["area"], row["weight_kg"], "kg")
print("持ち戻りの件数:", len(returned))
# 条件を書きかえて、北区の配送だけを取り出してみましょう。
よくある間違い
注意
絞り込むと、条件に合わない行が消えると思う人が多いです。実際は消えません。ループは新しいリストを作るだけで、元のリストには全部の行が残ります。だから同じ記録を、別の条件でもう一度絞り込めます。
やってみましょう: 地区ごとの配送
ドライバーの割り当てを決めるために、地区ごとの配送一覧が必要です。地区の名前を受け取り、その地区の行だけを返す関数を書いてください。見えないテストが、答えを確かめます。