Pythonではデータの集合を作成する際に 内包表記(リスト内包表記や集合内包表記)を使うことが多いですよね。
実は内包表記と集合内包表記の違いがよくわかっていなかったので、まとめてみました。
もしかすると、同じように思っている人が他にもいるのでは?
また、set
(集合)の基本的な概念についても軽く触れつつ、集合内包表記 {}
と set(map(lambda x: ...))
や set(filter(lambda x: ...))
の使い分けについて
詳しく解説します!
1. set(集合)とは?
Pythonの set
は 重複しない要素を持つデータ構造 です。リストとは異なり、同じ要素を複数回追加しても 1 つにまとめられます。
numbers = {1, 2, 3, 3, 4, 5}
print(numbers) # {1, 2, 3, 4, 5}
✔ 要素の重複を自動的に排除
✔ 順序が保証されない(セットの要素は順不同)
✔ in
演算子で高速に検索できる
2. 内包表記と集合内包表記の違い
🔹 内包表記(リスト内包表記)
リスト内包表記は、リストを作成するときに使います。
squared_list = [x**2 for x in range(5)]
print(squared_list) # [0, 1, 4, 9, 16]
※ x**2→xの2乗という意味です。ここでは0〜4の数字を2乗した値をリストにしています。
🔹 集合内包表記
集合を作成するときには {}
を使います。
squared_set = {x**2 for x in range(5)}
print(squared_set) # {0, 1, 4, 9, 16}
✔ リスト内包表記 [ ]
は順序を保持するリストを作成
✔ 集合内包表記 { }
は重複しない要素の集合を作成
3. 集合内包表記 {式 for 変数 in イテラブル if 条件} とは?
※ イテラブル→for ループで順番に要素を取り出せるもの(オブジェクト)の意味です。
集合内包表記 とは、リスト内包表記と同様に、簡潔に set
を作成する構文 です。
data = [1, 2, 2, 3, 4, 4, 5]
set_comp = {x for x in data}
print(set_comp) # {1, 2, 3, 4, 5} (重複なし)
✔ シンプルで可読性が高い
✔ ループが1回で済むのでパフォーマンスが良い
✔ 条件を追加するのも簡単(if
をつけるだけ)
evens = {x for x in range(10) if x % 2 == 0}
print(evens) # {0, 2, 4, 6, 8}
4. set(map(...)) と set(filter(...)) とは?
Python では map()
や filter()
を使ってデータを変換・フィルタリングできます。
🔹 map(lambda x: ..., イテラブル)
→ 各要素を変換
squared_set = set(map(lambda x: x**2, range(5)))
print(squared_set) # {0, 1, 4, 9, 16}
🔹 filter(lambda x: ..., イテラブル)
→ 条件に合う要素を抽出
evens = set(filter(lambda x: x % 2 == 0, range(10)))
print(evens) # {0, 2, 4, 6, 8}
✔ 複雑な処理を関数として適用しやすい
✔ map()
なら複数の関数を組み合わせやすい
5. 使い分けのポイント
目的 | 集合内包表記 {} | set(map(...)) / set(filter(...)) |
---|---|---|
可読性・シンプルさ | ✅ 直感的で読みやすい | ❌ 冗長になりがち |
パフォーマンス | ✅ 速い(ループ1回) | ❌ 関数呼び出しが増える |
条件付きのフィルタリング | ✅ if で簡単に書ける | ❌ filter(lambda x: ...) が必要 |
複雑な変換処理 | ❌ 長くなると読みにくい | ✅ map(lambda x: ...) で関数適用が簡単 |
6. まとめ
場面 | 集合内包表記 {} を使うべき? | set(map(...)) / set(filter(...)) を使うべき? |
---|---|---|
シンプルな変換 | ✅ 推奨!読みやすく高速 | ❌ 使うメリットが少ない |
条件付きフィルタリング | ✅ if をつけるだけでOK | ❌ filter(lambda x: ...) でやや冗長 |
複雑な処理(2つ以上の関数適用) | ❌ 可読性が悪くなる | ✅ map(lambda x: ...) で分かりやすくできる |
👉 結論:基本は集合内包表記 {}
を使う!
👉 例外的に、複数の関数適用をしたい場合は map()
を検討! 🚀
Pythonの set
って便利ですよね。
効率的に活用して、よりシンプルで読みやすいコードを書いてみてください!