【Python】レッスン4-14:集合(セット)の基本を理解しよう

ながみえ
【Python学習記事のアイキャッチ画像】Lesson4-14 集合の定義と基本操作を理解しよう

一つ前のLessonでは辞書の内包表記について学習しました。

今回は集合(セット)の基本について見ていきましょう。

Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:関数とスコープ編

Lesson4:データ構造編
・Lesson4-1:リストの定義と要素の追加を理解しよう
・Lesson4-2:リストの要素を削除しよう
・Lesson4-3:リストの情報を調べよう
・Lesson4-4:リストの集計・並べ替えを理解しよう
・Lesson4-5:リストのスライスを理解しよう
・Lesson4-6:リストのループ処理を理解しよう
・Lesson4-7:リストの内包表記を理解しよう
・Lesson4-8:リスト・タプル・辞書・集合の概要と違いを理解しよう
・Lesson4-9:タプルの基本を理解しよう
・Lesson4-10:タプルのアンパックを理解しよう
・Lesson4-11:辞書の基本を理解しよう
・Lesson4-12:辞書のループ処理を理解しよう
・Lesson4-13:辞書の内包表記を使ってリストから辞書を作ろう
・Lesson4-13:集合(セット)の基本を理解しよう ◁今回はココ
・練習問題4-1:宝探しゲームを作ろう
・練習問題4-2:ナインゲームを作ろう 
・練習問題4-3:マルバツゲームを作ろう
Lesson5:オブジェクト指向編
次のステップ:Python基礎習得者にお勧めの道5選(実務or副業)

<<前のページ

【Python学習記事のアイキャッチ画像】Lesson4-13 辞書の内包表記を理解しよう

Pythonの記事一覧

Python学習カテゴリの親ページ用アイキャッチ画像(テキスト&問題集)、記事一覧へのリンク案内

次のページ>>

【Python学習記事のアイキャッチ画像】Lesson4-☆1 宝探しゲームを作ろう

集合とは?|基本構文とよく使う集合演算の実例

データから重複を取り除く、共通要素や差分を素早く確かめる――そんな場面で力を発揮するのが、Pythonの「集合(set)」です。

本記事では、セットの基本的な作り方と特徴を押さえたうえで、和集合・積集合・差集合といった代表的な集合演算を、実務でそのまま使える形で整理します。

これを身につけると、リストの重複削除、タグやIDの突き合わせ、ログの差分チェックなどが短いコードで正確にこなせるようになり、存在判定も高速に扱えます。

それでは、実例と練習問題で着実に使いこなせるようにしていきましょう。

【Python】勉強猫がノートパソコンを前にして学習を始める様子。記事内の学習スタート用イラスト

集合とは|要素が重複しないデータ構造の定義方法とコード例

集合(セット)とは、重複する要素を持たず、要素の順序も保証されないデータの集まりです。

リストやタプルと異なり、同じ値を複数回追加しようとしても自動的に1つにまとめられるのが特徴です。

たとえばリストでは [1, 2, 2, 3] とすると重複が許されますが、セットでは {1, 2, 3} として扱われます。

集合は波括弧 {} を使って作成します。また空の集合を作成する場合は set()関数 を使用します。

new_set = {1, 2, 3}	# 新しい集合を定義
empty_set = set()	# 新しい空の集合を定義

new_dictionary = {}	# これは集合ではなく空の辞書

リストやタプルをセットに変換することも可能です。

また、以下のメソッド使用することで要素の追加や削除が行えます。

  • 追加: set.add(要素) で集合に要素を追加できます。
  • 削除: set.remove(要素) で集合から特定の要素を削除します。要素が存在しない場合はエラーになりますが、discard() を使うと存在しなくてもエラーは発生しません。

実際のコードを見てみましょう。

# セットの作成と要素の追加
fruits = {'りんご', 'バナナ', 'みかん'}	# セットの定義
fruits.add('ぶどう')					 # セットへ要素追加
print(fruits)							# {'りんご', 'バナナ', 'みかん', 'ぶどう'}

# 要素の削除
fruits.remove('みかん')	# セットから要素削除
print(fruits)			  # {'りんご', 'バナナ', 'ぶどう'}

和集合・積集合・差集合の使い分け|演算子とコード実例

集合を使うことで複数のデータセットに対して集合演算を行うことができます。

特に、和集合、積集合、差集合は、データの重複や共通点を扱う際に便利です。

  • 和集合: 2つの集合の要素をすべて含む新しい集合を作成します。A | B または A.union(B) で行います。
  • 積集合: 2つの集合に共通する要素だけを含む集合です。A & B または A.intersection(B) で実行します。
  • 差集合: 1つ目の集合には含まれるが、2つ目の集合には含まれない要素を取得します。
set1 = {'りんご', 'バナナ', 'みかん'}
set2 = {'ぶどう', 'バナナ', 'メロン'}

# 和集合
union_set = set1 | set2
print(f"和集合: {union_set}")  # {'りんご', 'バナナ', 'みかん', 'ぶどう', 'メロン'}

# 積集合
intersection_set = set1 & set2
print(f"積集合: {intersection_set}")  # {'バナナ'}

# 差集合
difference_set = set1 - set2
print(f"差集合: {difference_set}")  # {'りんご', 'みかん'}

まとめ|集合と集合演算を使いこなそう

集合(セット)は重複しない要素を扱うために非常に便利なデータ型です。

今回は集合の作成や基本的な操作に加えて、和集合、積集合、差集合といった集合演算も解説しました。

これらの操作を理解することでデータの扱い方がより効率的になります。Pythonの集合を使って、さまざまなデータ処理を試してみましょう!

Q
サイト改善アンケート|ご意見をお聞かせください(1分で終わります)

本サイトでは、みなさまの学習をよりサポートできるサービスを目指しております。
そのため、みなさまの「プログラミングを学習する理由」などをアンケート形式でお伺いしています。

1分だけ、ご協力いただけますと幸いです。

【Python】サイト改善アンケート
1.このサイトをどのように活用していますか?また、今後どのように活用したいですか?
5.気になっているサービス・商品があれば教えてください。
(複数選択可)
※ 特定の記事に関する内容の場合は、記事番号(Python Lesson〇-〇)をご記入願います。

練習問題:集合(セット)を使ってみよう

この記事で学習した「集合(セット)」を復習する練習問題に挑戦しましょう。

【Python】勉強猫がノートパソコンに向かい、練習問題に挑戦する様子。記事内の休憩用イラスト

問題|ランダムな数値で集合演算

1から30までの数字の中からランダムに10個選んで、それを3つの集合として定義してください。

さらにそれぞれの集合に対して 和集合、積集合、差集合 を計算して表示するプログラムを作成しましょう。

以下の要件に従ってコードを完成させてください。

  1. 集合の作成:1〜30の範囲からランダムに10個の要素を選び、それぞれ独立に3つの集合(集合1・集合2・集合3)を作成すること。
  2. 集合演算:3集合に対して以下を計算すること(演算子を使用)。
    • 和集合set1 | set2 | set3
    • 積集合set1 & set2 & set3
    • 差集合set1 - set2 - set3(集合1から集合2と集合3を順に差し引く)
  3. 出力:3つの元の集合と、和集合・積集合・差集合の計算結果をそれぞれ表示すること。
注意点

この問題を解くにはrandomモジュールのsample()関数を使用する必要があります。

覚えていますか?

あわせて読みたい
【Python】レッスン1-6:乱数を生成しよう
【Python】レッスン1-6:乱数を生成しよう

ただし、以下のような実行結果となるコードを書くこと。

集合1: {2, 5, 7, 12, 15, 18, 19, 22, 26, 28}
集合2: {3, 7, 9, 12, 14, 16, 19, 24, 28, 30}
集合3: {1, 5, 7, 12, 16, 18, 19, 20, 23, 24}

和集合: {1, 2, 3, 5, 7, 9, 12, 14, 15, 16, 18, 19, 20, 22, 23, 24, 26, 28, 30}
積集合: {7, 12, 19}
差集合: {2, 15, 22, 26}

ヒント|難しいと感じる人だけ見よう

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

Q
ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1:1〜30から重複なしで10個ずつ取り出し、3つの集合を作って中身を確認するパート
 ・乱数で取り出した複数の値を、そのまま集合に変換すると重複が自動的に取り除かれます。
 ・3つの集合は同じ作り方を独立に繰り返して用意します。
 ・表示時はラベル(例:「集合1:」など)を付けると見やすくなります。

2:3つの集合に対して和・積・差を計算し、日本語ラベルで結果を表示するパート
 ・和集合=まとめる、積集合=共通だけ残す、差集合=不要(他の集合にある)を取り除く、というイメージを持つ。
 ・差集合は向きがある(どちらからどちらを引くかで結果が変わる)。ここでは「集合1から集合2と集合3を除外」。
 ・出力はラベルを付けると何の結果かわかりやすい。

Q
ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

''' (穴埋め)乱数を使用するための import 文を書く '''
# 1から30までの数字からランダムに10個の数字を選択して集合を作成
set1 = '''(穴埋め)'''(random.sample(range(1, 31), 10))
set2 = set('''(穴埋め)'''(range(1, 31), 10))
set3 = set(random.sample(range(1, 31), 10))

# それぞれの集合を表示
print("集合1:", set1)
print("集合2:", set2)
print("集合3:", set3)

''' (穴埋め)3つの集合 set1, set2, set3 の和集合を求め、変数 union_set に代入する '''
intersection_set = set1 & set2 & set3	# 積集合
''' (穴埋め)集合1から集合2と集合3を順に差し引いた差集合を difference_set に代入する '''

# 結果を表示
print("和集合:", union_set)
print("積集合:", intersection_set)
print("差集合:", difference_set)

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

解答例|ランダム三集合プログラム

例えば以下のようなプログラムが考えられます。

Q
正解コード
import random

# 1から30までの数字からランダムに10個の数字を選択して集合を作成
set1 = set(random.sample(range(1, 31), 10))
set2 = set(random.sample(range(1, 31), 10))
set3 = set(random.sample(range(1, 31), 10))

# それぞれの集合を表示
print("集合1:", set1)
print("集合2:", set2)
print("集合3:", set3)

union_set = set1 | set2 | set3			# 和集合
intersection_set = set1 & set2 & set3	# 積集合
difference_set = set1 - set2 - set3		# 差集合 (集合1から集合2、集合3を差し引く)

# 結果を表示
print("和集合:", union_set)
print("積集合:", intersection_set)
print("差集合:", difference_set)

解答例の解説|ランダム三集合プログラムの考え方

解答例の詳細解説は以下の通りです。

Q
詳細解説

3つの集合を作って中身を確認するパート

# ランダムな数字の集合を作成し、和集合、積集合、差集合を学ぶためのコード
import random

# 1から30までの数字からランダムに10個の数字を選択して集合を作成
set1 = set(random.sample(range(1, 31), 10))
set2 = set(random.sample(range(1, 31), 10))
set3 = set(random.sample(range(1, 31), 10))

# それぞれの集合を表示
print("集合1:", set1)
print("集合2:", set2)
print("集合3:", set3)

ここでは、乱数を使って1〜30の範囲から数字を取り出し、重複を許さない集合を3つ用意します。
集合は同じ値が2回入らない性質を持つため、取り出した値を集合にすれば自動的に重複がなくなります。
3つの集合はそれぞれ独立に作るので、同じ値が別々の集合に含まれることはあります。
最後に、それぞれの集合の内容をラベル付きで表示し、どんな値が選ばれたかを確認します。
集合は順序を持たないため、表示される並び順は実行のたびに変わる点に注意してください。

3つの集合に対して和・積・差を計算

union_set = set1 | set2 | set3			# 和集合
intersection_set = set1 & set2 & set3	# 積集合
difference_set = set1 - set2 - set3		# 差集合 (集合1から集合2、集合3を差し引く)

# 結果を表示
print("和集合:", union_set)
print("積集合:", intersection_set)
print("差集合:", difference_set)

ここでは、用意した3つの集合から「和集合」「積集合」「差集合」を求めます。
和集合は3つの集合に含まれる要素を重複なくまとめたもの、積集合は3つすべてに共通して含まれる要素、差集合は「集合1にだけ残す」イメージで、集合1から集合2と集合3に含まれる要素を取り除いた結果です。
最後に、それぞれの結果をラベル付きで表示して確認します。
集合は順序を持たないため、表示される並び順は実行ごとに変わる点に注意してください。

もっと分かりやすい学習サイトにするために

この記事を読んで「ここが分かりにくかった」「ここが難しかった」等の意見を募集しています。

世界一わかりやすいPython学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

<<前のページ

【Python学習記事のアイキャッチ画像】Lesson4-13 辞書の内包表記を理解しよう

Pythonの記事一覧

Python学習カテゴリの親ページ用アイキャッチ画像(テキスト&問題集)、記事一覧へのリンク案内

次のページ>>

【Python学習記事のアイキャッチ画像】Lesson4-☆1 宝探しゲームを作ろう

集合(セット)の基本の疑問解消|FAQと用語のまとめ

初心者がつまずきやすいポイントをFAQとしてまとめ、またよく使う専門用語をわかりやすく整理しました。

理解を深めたいときや、ふと疑問に感じたときに役立ててください。

FAQ|集合(セット)の基本に関するよくある質問

Q
Q1. リストと集合の最大の違いは?

集合(set)は順序を持たず、要素の重複を許しません。リストは順序があり、重複も可なので用途によって使い分けます。

Q
Q2. 和集合と積集合の使いどころは?

和集合は全体の要素を一つにまとめたいとき、積集合は共通項を見つけたいときに使います。分析やフィルタ処理に便利です。

Q
Q3. 集合にリストや辞書を入れることはできますか?

いいえ、リストや辞書は変更可能なオブジェクトなので、集合の要素にはできません。代わりにタプルを使うと良いです。

Python用語集|集合(セット)の基本に関する用語一覧

今回の記事で出てきた用語・関数などを一覧で紹介します。

このサイトに出てくる 全てのPython用語をまとめた用語集 も活用してください。

Python用語定義・使い方の概要解説記事へのリンク
リスト複数の値を順番に保持できるデータ構造で、要素の追加・削除・変更が可能Lesson4-1
タプル順序付きで複数の値を保持するが、作成後の変更ができないイミュータブルなデータ構造Lesson4-9
集合重複しない要素の集まりを扱うデータ構造。順序は保証されず、集合演算が可能本記事
set() 関数イテラブルを集合型に変換するための関数。重複が自動的に排除される本記事
add() メソッド集合に新しい要素を追加するメソッド。既に存在する場合は何もしない本記事
remove() メソッド集合から指定した要素を削除するメソッド。要素が存在しない場合はエラーになるLesson4-4
discard() メソッド集合から指定した要素を削除するが、要素が存在しなくてもエラーを出さない本記事
和集合2つの集合のすべての要素をまとめた集合。`A | BまたはA.union(B)` で求める本記事
積集合2つの集合の共通部分を取り出した集合。A & B または A.intersection(B) で求める本記事
差集合一方の集合にのみ存在する要素の集合。A - B または A.difference(B) で求める本記事
記事URLをコピーしました