CHAPTER 1 ・ 書き方を一段上げる / Lesson 01
繰り返しを1行にまとめる(内包表記)
「for で回して、リストに足す」を1行で書く。条件で絞る・形を変えるも、同じ型で書けます。
このレッスンが終わったら
「内包表記は、for のくり返しでリストを作る処理を1行にしたもの。[式 for 変数 in 元 if 条件] の形で書く」と言える。
こんな場面、ありませんか?
経費や売上の一覧から、「条件に合うものだけを取り出して、別のリストを作る」作業は、実務で何度も出てきます。基礎編の for を使うと、こう書けました。
▶ 実行を押すと、ここに結果が出ます
正しく動きます。ただ、「空のリストを作る → for で回す → if で選ぶ → append で足す」という4行の型を、毎回書くことになります。しかも、「万円に直す」「名前の空白を取る」など、リストを作る場面はいくらでもあります。
この「型」を、1行で書けるのが、この回の主役、内包表記です。
1行で書いてみる
さっきと同じことを、1行でやってみましょう。「実行」を押してください。
▶ 実行を押すと、ここに結果が出ます
さきほどと、同じ結果になりましたか。[s for s in sales if s >= 300000] が、4行ぶんの仕事をしています。
次は、取り出すのではなく、全部を変換してみます。売上を「万円」にします(// は、割り算の整数部分だけを出す記号です)。
▶ 実行を押すと、ここに結果が出ます
最後に、絞ってから変換します。30万円以上のものだけを、万円にします。
▶ 実行を押すと、ここに結果が出ます
仕組みを読む
内包表記は、3つの部品でできています。
[リストを作るs // 10000何を入れる?(式)for s in salesどこから1つずつ取り出す?if s >= 300000どれだけ選ぶ?(省略できる)]リストを閉じる基礎編の for と見比べると、同じ部品が、順番を変えて並んでいるだけです。
for 文(基礎編)
big_man = []
for s in sales:
if s >= 300000:
big_man.append(s // 10000)内包表記(1行)
big_man = [s // 10000 for s in sales if s >= 300000]
[新しいリストを作ります s // 10000(最後に)s を 10000 で割った整数部分を入れます for s in salessales から、1つずつ取り出して「s」と呼び if s >= 300000s が 300000 以上のものだけを通して]リストにして返します日本語にすると
変えて、試す
① 文字を整える。 Excelから貼り付けた名前には、余計な空白が付いていることがあります。strip()(前後の空白を取る)を、全員に使います。
▶ 実行を押すと、ここに結果が出ます
② CSVの1列だけを取り出す。 CSVを1行ずつ辞書にして読み(基礎編 Lesson 12)、「売上」の列だけを、数字のリストにします。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
③ 「達成/未達」のように、2通りに分ける。 全員に、条件によって別の値を付けたいときは、先頭の式の中に if ... else ... を入れます。
▶ 実行を押すと、ここに結果が出ます
ここで、書く場所に注意してください。「絞り込みの if」はうしろ、「2通りに分ける if ... else」はまえです。間違えると、エラーになります。
▶ 実行を押すと、ここに結果が出ます
SyntaxError(書き方の間違い)と出ます。「全部に値を付けたい → if ... else は前」「一部だけ残したい → if は後ろ」と覚えましょう。
④ 辞書も、同じ形で作れる。 { } で囲み、「キー: 値」の形にします。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
同じ「部署」は、あとの行で上書きされます(3月の値が残ります)。部署ごとの合計は、Lesson 06 の辞書の使い方で作ります。
自分で書く
お題① 経費の一覧から、5,000円以上のものだけを取り出したリストを、表示してください。
▶ 実行を押すと、ここに結果が出ます
ヒントを見る
[c for c in costs if c >= 5000] の形です。作ったリストを print で表示するのを忘れずに。
答えの例を見る
costs = [1200, 540, 8800, 15400, 3300] big = [c for c in costs if c >= 5000] print(big)
お題② 次の名前のリストの、前後の空白を取り、さらに「様」を付けたリストを表示してください。
▶ 実行を押すと、ここに結果が出ます
ヒントを見る
[n.strip() + "様" for n in raw_names] の形です。文字をつなぐには + を使います。
答えの例を見る
raw_names = [" 田中 ", "佐藤", " 鈴木 "] names = [n.strip() + "様" for n in raw_names] print(names)
お題③ sales.csv から、「営業」部の売上だけを、数字のリストにして表示してください。
この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。
▶ 実行を押すと、ここに結果が出ます
ヒントを見る
[int(row["売上"]) for row in rows if row["部署"] == "営業"] の形です。if は後ろに書きます。
答えの例を見る
import csv
with open("sales.csv", encoding="utf-8") as f:
rows = list(csv.DictReader(f))
sales = [int(row["売上"]) for row in rows if row["部署"] == "営業"]
print(sales)仕事ならどう使う?
理解チェック[x * 2 for x in [1, 2, 3, 4] if x >= 3] の結果は、どれでしょう?
理解チェック「点数が60点以上なら『合格』、そうでなければ『不合格』」という新しいリストを、全員ぶん作りたいときは?