本文へスキップ
BecomeCoder

Pythonコース · 第8章 Python の道具箱 ― もっと便利に、もっと実務らしく · レッスン29

高度な内包表記 ― 辞書・集合・ジェネレータ式

ブラウザで完結

導入

第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(...) で表示するのを忘れずに。

実際に動かしてみよう

下のエディタにPythonを書いて「実行」を押すと、ブラウザ内のPythonで出力が表示されます。本文の例をそのまま試したり、書き換えたりしてみましょう(input() を使う回は「標準入力」欄に値を入れてから実行します)。

Python — ブラウザ内で実行

ブラウザ内でPythonを動かす環境(Skulpt)を読み込みます(初回のみ少し時間がかかります)。
スクロールして表示された時点でも自動で読み込まれます。