Pythonには、リストを作成するための「リスト内包表記」と同様に、集合(set)を簡潔に作成するための**「集合内包表記(Set Comprehension)」**があります。
リスト内包表記が [](角括弧)を使用するのに対し、集合内包表記は {}(波括弧)を使用します。
集合内包表記の最大の特徴は、処理の過程で自動的に重複する要素が排除される点です。これにより、「データの加工」と「ユニーク化(重複削除)」を同時に、かつ1行で記述できます。
この記事では、集合内包表記の基本的な書き方と、条件式を組み合わせたフィルタリング方法について解説します。
集合内包表記の基本構文
集合内包表記は、{} の中に for 文を記述します。
構文:
{適用する式 for 変数 in イテラブル}
具体的な使用例:文字列の正規化
入力フォームから送信されたタグ(キーワード)のリストを処理するケースを考えます。ユーザーによって大文字・小文字の入力がバラバラ(例: “Python”, “python”)である場合、これらをすべて小文字に統一し、かつ重複を取り除いたセットを作成します。
# 入力されたタグのリスト(重複や表記揺れがある)
raw_tags = ["Python", "django", "python", "API", "Django", "WEB"]
# 集合内包表記を使用
# 1. tag.lower() で小文字に変換
# 2. set なので自動的に重複が削除される
unique_tags = {tag.lower() for tag in raw_tags}
print(f"元のリスト: {raw_tags}")
print(f"処理後のセット: {unique_tags}")
実行結果:
元のリスト: ['Python', 'django', 'python', 'API', 'Django', 'WEB']
処理後のセット: {'python', 'api', 'django', 'web'}
リスト内包表記 [...] を使った場合、['python', 'django', 'python', ...] と重複が残りますが、集合内包表記 {...} を使うことで、一意な(ユニークな)要素だけのコレクションが得られます。
条件付きの集合内包表記
リスト内包表記と同様に、if 文を追加して特定の条件を満たす要素だけを抽出することも可能です。
構文:
{適用する式 for 変数 in イテラブル if 条件式}
具体的な使用例:有効なデータの抽出
センサーデータのリストがあり、そこから「エラー値(負の数)」を除外し、正常なデータのみのセットを作成する例です。
# センサーから取得したデータ(重複やノイズが含まれる)
sensor_data = [15.5, 16.2, -1.0, 15.5, 14.8, -99.9, 16.2]
# 0以上のデータのみを抽出し、重複を排除してセットにする
valid_data_set = {data for data in sensor_data if data >= 0}
print(f"元のデータ: {sensor_data}")
print(f"有効データセット: {valid_data_set}")
実行結果:
元のデータ: [15.5, 16.2, -1.0, 15.5, 14.8, -99.9, 16.2]
有効データセット: {16.2, 15.5, 14.8}
まとめ
- 集合内包表記は
{式 for 変数 in イテラブル}の形式で記述します。 - リスト内包表記の
[]を{}に変えるだけで使用できます。 - 生成されるオブジェクトは
setであるため、要素の重複が自動的に削除されます。 - 順序は保持されません。
- 「データの変換」と「重複削除」を同時に行いたい場合に非常に効率的です。
