Pythonにおけるセットについて【初心者向け解説記事】
Workteria(ワークテリア)では難易度の高いものから低いものまで、スキルや経験に合わせた案件を多数揃えています。会員登録は無料ですので、ぜひ会員登録してご希望の案件を探してみてください!
フリーランス/正社員のエンジニアとして活躍するには、ご自身のスキルや経験に合わせた仕事を選ぶことが大切です。ご希望の案件がみつからない場合はお気軽にお問い合わせください!ユーザ満足度の高いキャリアコンサルタントが在籍していますので、希望条件や悩み事などなんでもご相談ください。ご希望にピッタリの案件をご紹介させていただきます。
セットとは?
Pythonのセット(set)とは、重複する値を持たない、順序が定義されていないコレクションのデータ型です。セットは他のプログラミング言語ではセット(set)やハッシュセット(hashset)と呼ばれることもあります。
セットの特徴は、その要素が一意(重複しない)であることと、要素の順序が保証されていないことです。これはリストやタプルとは異なり、特定のインデックスで要素にアクセスすることはできません。
セットは、データ分析、データフィルタリング、そして重複要素の除去に役立つツールです。また、あるセットが別のセットに完全に含まれているかどうかなどの論理的な関係を容易に比較することができます。
セットの作成
セットは波カッコ {} または set() コンストラクタを使用して作成します。以下に例を示します。
colors = {"赤", "青", "緑", "赤"}
print(colors) # 出力: {'赤', '緑', '青'}
重複した要素を持つセットを作成しようとすると、Pythonは自動的に重複を除去します。上記の例では、"赤" が重複していましたが、出力は重複を除去した結果を表示しています。
また、set() コンストラクタを使用してセットを作成することも可能です。これは特に既存のリストやタプルからセットを作成する場合に便利です。
colors_list = ["赤", "青", "緑", "赤"]
colors_set = set(colors_list)
print(colors_set) # 出力: {'赤', '緑', '青'}
この例では、set() コンストラクタはリスト colors_list を引数に取り、その要素からセットを作成しています。ここでも同様に、重複した要素 "赤" はセットに1回しか現れません。
注意することとして、セットは順序を持たないため、要素が追加された順序は保持されません。このため、セットの要素をイテレートすると、それらは追加された順序とは異なる順序で表示されることがあります。以下に例を示します。
colors_list = ["赤", "青", "緑", "赤"]
colors_set = set(colors_list)
for i in colors_set:
print(i)
"""
出力:
緑
青
赤
"""
for文でセット内の要素を取り出していますが、最初のリストとは全く違う順番になっていることがわかると思います。
最後に、空のセットを作成するときは注意が必要です。 {} は空の辞書を作成しますので、空のセットを作成するには set() を使用します。
empty_dict = {}
print(type(empty_dict)) # 出力: <class 'dict'>
empty_set = set()
print(type(empty_set)) # 出力: <class 'set'>
ここで、type()は引数の型を返す関数です。
セットの要素へのアクセス
セットはリストや辞書とは異なり、要素への直接的なアクセスやインデックスによるアクセスを行うことができません。これは、上記の通りセットは順序付けられていないためインデックスが使えず、またセットの要素にアクセスするためのキーもないからです。しかし、in演算子を用いることで、セット内に要素が存在するかどうかを確認することが出来ます。
colors = {"赤", "青", "緑"}
print("赤" in colors) # 出力: True
print("黄" in colors) # 出力: False
リストでも同様に要素の存在確認を行うことはできますが、セットははるかに高速であるため、要素の存在確認を行う際はリストを用いるとよいでしょう。
セットの要素への操作
Pythonのセットでは、要素の追加、削除など基本的な操作が可能です。要素の変更は、要素に直接アクセスることができないため行うことは出来ません。
そのため、セット内の要素を更新したい場合は、削除と追加を組み合わせる必要があります。
要素の追加
セットへ要素を追加するには、addメソッドを使用します。以下に具体的な例を示します。
colors = {"赤", "青", "緑"}
colors.add("黄")
print(colors) # 出力:{'赤', '黄', '青', '緑'}
また、複数の要素を一度に追加する場合はupdateメソッドを使用します。updateメソッドには、リストやタプル、セットなどのイテラブルなオブジェクトを渡すことができます。
colors.update(["白", "黒"])
print(colors) # 出力:{'黒', '黄', '白', '赤', '青', '緑'}
要素の削除
セットから要素を削除するには、removeメソッドまたはdiscardメソッドを使用します。どちらのメソッドも引数に削除する要素を指定します。
removeメソッドを使用すると、指定した要素がセットに存在しない場合、Pythonはエラー(KeyError)を発生させます。一方、discardメソッドは指定した要素が存在しない場合でもエラーを発生させず、何も行われません。
# 要素の削除
colors.remove("赤")
print(colors) # 出力:{'緑', '黄', '青', '白', '黒'}
# 存在しない要素の削除(エラー発生)
# colors.remove("赤") # KeyError: '赤'
# 存在しない要素の削除(エラーは発生せず、何も起こらない)
colors.discard("赤")
print(colors) # 出力:{'緑', '黄', '青', '白', '黒'}
また、セット内の全ての要素を削除して空のセットにする場合は、clearメソッドを使用します。
colors.clear()
print(colors) # 出力:set()
セットの活用方法
セットは一見するとあまり使い道がないように感じるかもしれませんが、その独自の特性はさまざまな場面で非常に役立ちます。以下にいくつかの具体的な活用方法を示します。
データの一意性を保証
セットの最大の特徴は、要素の一意性を保証することです。したがって、データから重複を削除する際にセットを使用することがあります。リストや他のデータ構造から重複する要素を削除するためには、そのデータをセットに変換し、再度リストに戻すことが一般的です。
original_list = [1, 2, 2, 3, 4, 4, 5, 5, 5]
set_from_list = set(original_list) # {1, 2, 3, 4, 5}
unique_list = list(set_from_list) # [1, 2, 3, 4, 5]
要素の存在確認(メンバーシップテスト)
セットは、特定の要素がデータセットに存在するかどうかを高速にチェックできます。したがって、「ある要素が特定のコレクションに存在するかどうか」を頻繁に確認する必要がある場合、そのコレクションをセットとして保持することでチェックにかかる処理時間を短くすることが出来ます。
primes = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29} #素数のリスト
def is_prime(n):
return n in primes
print(is_prime(4)) # False
print(is_prime(13)) # True
他にも、数学的な集合演算などを行うことも出来ますが、これについては長くなるので別記事で取り扱います。
まとめ
Pythonのセットは、順序が定義されず、重複する要素を持たないコレクションデータ型で、その独特の性質によりデータ分析、フィルタリング、及び論理比較に非常に役立つツールとなっています。本記事では、Pythonのセットの作成から基本的な操作(要素の追加、削除など)、活用方法について詳しく解説しました。
特に、セットはその一意性の保証から、データから重複を削除する用途や、要素の存在確認(メンバーシップテスト)に高速に対応できるため、大量のデータ操作におけるパフォーマンス向上に寄与します。また、集合演算の方法については、後続の記事で詳しく解説する予定です。
Pythonのセットは、そのシンプルさと強力な機能から、あらゆるプログラマのツールキットに含まれるべき重要なデータ構造です。本記事を通じて、その基本的な理解と活用方法を学べたことでしょう。
【著者】
フォワードソフト株式会社のエンジニア。Java、Python、JavaScript、C#などの言語の他、クラウドやネットワーク技術を勉強しています。PythonやVBAを使った自動化で楽をする方法を考えるのが好きです。 最近はジェネレーティブAIの業務利用に関する検証を行っています。 資格を通じて知識を吸収することを心がけており、セキュリティスペシャリスト、データベーススペシャリスト、応用情報技術者、Oracle Certified Java Programmer Gold SE 11、Pythin3 エンジニア認定試験、HTML5プロフェッショナル認定試験レベル2、AWSプラクティショナーなどの情報資格を保有しています。
正社員/フリーランスの方でこのようなお悩みありませんか?
- 自分に合う案件を定期的に紹介してもらいたい
- 週2、リモートワークなど自由な働き方をしてみたい
- 面倒な案件探し・契約周りは任せて仕事に集中したい
そのような方はぜひ、Workteriaサイトをご利用ください!
定期的にご本人に合う高額案件を紹介
リモートワークなど自由な働き方ができる案件多数
専属エージェントが契約や請求をトータルサポート