導入
第5章(レッスン21)で、リストを1行で作る内包表記を学びました。実は同じ書き方は、辞書や集合、そして「必要なときに1つずつ計算する」ジェネレータ式にも使えます。
説明
辞書内包表記は {key: value for ... } の形です。集合内包表記は {式 for ...} の形で、重複のない集合を作ります。
fruits = ["apple", "banana", "cherry"]
lengths = {f: len(f) for f in fruits}
print(lengths)
nums = [1, 2, 2, 3, 3, 3, 4]
uniq_doubled = {n * 2 for n in nums}
print(uniq_doubled)
{f: len(f) for f in fruits} は「fruits の各要素 f について、f をキー・len(f) を値とする辞書を作る」という意味です。集合内包表記は同じ発想で、重複する結果は自動的に1つにまとめられます。
もう1つ、ジェネレータ式があります。見た目はリスト内包表記の [] を () に変えるだけですが、動きが違います。リスト内包表記は結果を全部メモリに作ってから返すのに対し、ジェネレータ式は「必要になったら1つずつ計算する」ため、sum() や for のように順番に処理する相手に渡すとメモリを節約できます。
squares_sum = sum(n * n for n in range(1, 6))
print(squares_sum)
total_len = sum(len(w) for w in ["a", "bb", "ccc"])
print(total_len)
大きなデータを扱うとき、いったんリストに全部展開する必要がないなら、ジェネレータ式のほうが効率的です。
やってみよう
fruits の中身や nums の条件を変えたり、sum(...) の中の式を変えたりして、辞書内包表記・集合内包表記・ジェネレータ式の動きを確かめましょう。
演習
words = ["python", "java", "go"] から、辞書内包表記で「単語: その文字数」の辞書を作って表示してください(結果は {'python': 6, 'java': 4, 'go': 2})。
ヒント1を見る
{w: len(w) for w in words} の形です。
ヒント2を見る
最後に print(...) で表示するのを忘れずに。