Pythonの集合内包表記(set comprehension)の使い方について解説します。
Contents
集合内包表記(set comprehension)
Pythonにおける集合内包表記(set comprehension)とは、既存のリスト等のイテラブルなオブジェクトから集合を作成する際にシンプルに記載するための定義方法です。
本記事では、集合内包表記の基本的な使い方について紹介します。
イテラブル(iterable)なオブジェクトとは反復可能なオブジェクトでリスト(list)、タプル(tuple)、辞書(dict)等が代表的なものになります。また、__iter__()メソッドかもしくは__getitem__()メソッドを持つ任意のクラスのオブジェクトもfor文の繰り返しで使用することができます。
イテラブル(iterable)に関する公式ドキュメントの説明はこちらを参照してください。
集合内包表記の使い方
集合内包表記の構文は以下になります。
{式 for 仮変数 in イテラブルなオブジェクト if 条件}
上記の意味合いとしては、”イテラブルなオブジェクト"から要素を順番に”仮変数”に取得し、”条件”に一致するものを使って"式"を適用した値で集合を作るということになります。
なかなか文章で書いても実感がわかないと思いますので、以降で簡単な例を使って集合内包表記の使い方を確認しましょう。
既存リストから集合を作成する場合
既存リストが用意されているときに、そのリストから集合を作成するには以下のようにします。
data = [10, 15, 20, 25, 30, 35, 40, 45, 50, 10, 15, 20, 25, 30] # 集合内包表記 data_set = {dt for dt in data if dt % 2 == 0} print(f"data_set : {data_set}")
【実行結果】 data_set : {40, 10, 50, 20, 30}
上記は、既に作成してあるdataという数値リストの中から偶数(2で割り切れるもの)を取り出して新しく集合を作成しています。
集合は重複した値は持ちませんので、重複した値は一つにまとめられていることが分かります。また、集合は順序を持たないため結果の順序は元となったリストの順序によらないことにも注意しましょう。
集合内包表記を使用しないで既存リストから集合を作成する場合
集合内包表記を使用しない形でプログラムを記述することももちろん可能です。上記例を集合内包表記を使わずに記載すると以下のようになります。
data = [10, 15, 20, 25, 30, 35, 40, 45, 50, 10, 15, 20, 25, 30] # 内包表記を使わない場合 data_set = set() for dt in data: if dt % 2 == 0: data_set.add(dt) print(f"data_set : {data_set}")
【実行結果】 data_set : {40, 10, 50, 20, 30}
集合内包表記を積極的に使用するべき理由と注意点
上記で集合内包表記の基本的な使い方を紹介しました。
例を見てみると、集合内包表記はシンプルに記載できていることが分かったかと思います。また、集合内包表記は、集合内包表記を使用しない記載方法よりも処理速度が速いという特徴があるため、積極的に使用するように意識するとよいでしょう。
ただし、注意点として条件が複雑な場合等には、必ずしも集合内包表記を採用するべきではありません。
チームでの開発をしている場合には、チームメンバーの他の人もソースを読むことになるため、読みやすく内容を理解しやすいように可読性を意識したコードを書くことが重要です。集合内包表記を使うことでコードが複雑になってしまう恐れがある場合には、集合内包表記を使用するべきかよく検討するようにしましょう。
まとめ
Pythonの集合内包表記(set comprehension)の使い方について解説しました。
集合内包表記(set comprehension)は、既存のリスト等のイテラブルなオブジェクトから集合を作成する際にシンプルに記載するための定義方法のことを言います。
集合内包表記を用いるとシンプルな記載ができる上に、処理速度が高速であるという特徴があります。一方で、条件等が複雑な場合には可読性が悪くなり、読みにくくなってしまうこともあるため、複雑なケースでは使用するべきかよく検討しましょう。
Pythonにおける内包表記は他にも「リスト内包表記」「辞書内包表記」「ジェネレータ内包表記」といった種類があります。内包表記については、「内包表記(まとめ)」にまとめていますので興味があれば参考にしてください。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。