Pythonデータ構造|集合の定義と演算でデータの重複を排除する方法【レッスン4-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を用いたアプリ開発
Pythonの集合とは?基本構文とよく使う集合演算の実例
この章ではPythonにおける「集合の定義と基本操作」の意味や使い方を学習します。必要ない方はここをクリックして練習問題へ飛びましょう。
Pythonの集合(セット)は要素が重複しないデータの集まりを扱うためのデータ型です。
集合の基本的な定義方法や操作方法を理解することで、効率的なデータ処理が可能になります。今回は集合の基本操作に加えて、和集合、積集合、差集合についても解説します。
集合(セット)とは?
集合(セット)とは、重複する要素を持たず、要素の順序も保証されないデータの集まりです。
リストやタプルと異なり、同じ値を複数回追加しようとしても自動的に1つにまとめられるのが特徴です。
たとえばリストでは [1, 2, 2, 3]
とすると重複が許されますが、セットでは {1, 2, 3}
として扱われます。
集合の作成と基本操作
集合は波括弧 {}
を使って作成します(空のセットを作成する場合はset()
関数を使用します。)。
リストやタプルをセットに変換することも可能です。
セットの基本操作
- 追加:
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つ目の集合には含まれない要素を取得します。
A - B
またはA.difference(B)
を使用します。
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の集合(セット)は重複しない要素を扱うために非常に便利なデータ型です。
今回は集合の作成や基本的な操作に加えて、和集合、積集合、差集合といった集合演算も解説しました。
これらの操作を理解することでデータの扱い方がより効率的になります。Pythonの集合を使って、さまざまなデータ処理を試してみましょう!
練習問題:ランダムな数値で集合演算を学習しよう
1から30までの数字の中からランダムに10個選んで、それを3つの集合として定義してください。
さらにそれぞれの集合に対して 和集合、積集合、差集合 を計算して表示するプログラムを作成しましょう。
問題の詳細条件
以下の要件に従ってコードを完成させてください。
- 1から30までの範囲から、ランダムに10個の数字を選んだ集合を3つ作成すること。
- 3つの集合に対して、以下の集合演算を実行すること:
- 和集合(
|
演算子または.union()
メソッドを使用) - 積集合(
&
演算子または.intersection()
メソッドを使用) - 差集合(
-
演算子または.difference()
メソッドを使用)
- 和集合(
- 最終結果を日本語で表示すること。
※差集合は1つ目の集合から2つ目と3つ目の要素を引くこと
ただし、以下のような実行結果となるコードを書くこと。
集合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からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
- ヒント1【コードの構成を見る】
-
正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)1:randomモジュールをインポート
2:random.sampleを使って1から30までの範囲でランダムに10個の数字を選択し、set1を作成
3:random.sampleを使って1から30までの範囲でランダムに10個の数字を選択し、set2を作成
4:random.sampleを使って1から30までの範囲でランダムに10個の数字を選択し、set3を作成
5:集合1の内容を表示
6:集合2の内容を表示
7:集合3の内容を表示
8:和集合を計算して変数union_setに代入
9:積集合を計算して変数intersection_setに代入
10:差集合を計算して変数difference_setに代入
11:和集合の結果を表示
12:積集合の結果を表示
13:差集合の結果を表示
- ヒント2【穴埋め問題にする】
-
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
# ランダムな数字の集合を作成し、和集合、積集合、差集合を学ぶためのコード import random # 1から30までの数字からランダムに10個の数字を選択して集合を作成 """【穴埋め問題1】 ここに1から30までの範囲でランダムに10個の数字を選んでset1, set2, set3を作成するコードを書いてください。 """ # それぞれの集合を表示 print("集合1:", set1) print("集合2:", set2) print("集合3:", set3) # 和集合 """【穴埋め問題2】 ここに3つの集合の和集合を計算するコードを書いてください。 """ # 積集合 """【穴埋め問題3】 ここに3つの集合の積集合を計算するコードを書いてください。 """ # 差集合 """【穴埋め問題4】 ここに集合1から集合2と集合3の差集合を計算するコードを書いてください。 """ # 結果を表示 print("和集合:", union_set) print("積集合:", intersection_set) print("差集合:", difference_set)
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
問題の答え合わせと解説
この問題の一つの正解例とそのコードの解説を以下に示します。
一つの正解例
例えば以下のようなプログラムが考えられます。
- 正解コード
-
# ランダムな数字の集合を作成し、和集合、積集合、差集合を学ぶためのコード 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 # 差集合 (集合1から集合2、集合3を差し引く) difference_set = set1 - set2 - set3 # 結果を表示 print("和集合:", union_set) print("積集合:", intersection_set) print("差集合:", difference_set)
正解例の詳細解説
このプログラムではPythonの 集合(セット) を使って3つの集合を作成し、和集合、積集合、差集合を学びます。
まずコードを各ブロックごとに分解して詳しく説明していきます。
- 詳細解説
-
ランダムな数を使った集合の作成
import random set1 = set(random.sample(range(1, 31), 10)) set2 = set(random.sample(range(1, 31), 10)) set3 = set(random.sample(range(1, 31), 10))
ここではPythonの random.sample() 関数を使って、1から30までの数値の中からランダムに10個の数を選び出し、それを 集合(セット) に変換しています。
このコードでは、
set1
、set2
、set3
という3つの集合を作成しています。集合の内容を表示
print("集合1:", set1) print("集合2:", set2) print("集合3:", set3)
ここでは作成した3つの集合の内容を画面に表示しています。
集合の中の要素は順不同で表示されますが、重複している要素は存在しません。
和集合の計算
union_set = set1 | set2 | set3
和集合 とは2つ以上の集合の要素をすべて含んだ新しい集合です。
このコードでは、
set1
、set2
、set3
のすべての要素を含んだ集合 union_set を作成しています。積集合の計算
intersection_set = set1 & set2 & set3
積集合 とは複数の集合に共通する要素だけを含む新しい集合です。
このコードでは、
set1
、set2
、set3
に共通する要素だけを持つ intersection_set を作成しています。差集合の計算
difference_set = set1 - set2 - set3
差集合 とは1つの集合から他の集合に含まれている要素を取り除いた集合です。
このコードでは、
set1
からset2
およびset3
の要素を引いた difference_set を作成しています。結果の表示
print("和集合:", union_set) print("積集合:", intersection_set) print("差集合:", difference_set)
最後に計算された和集合、積集合、差集合の結果を画面に表示しています。
これにより各演算の結果が確認できます。
まとめ
このプログラムを通じて集合の基本的な操作である和集合、積集合、差集合を学びました。
集合は上手に使うことで、重複を防ぎながら効率的にデータを管理することができます。ぜひ、他の集合演算も試して、Pythonでの集合操作に慣れていきましょう!
FAQ|Python集合の基本操作と演算
- Q1. リストと集合の最大の違いは?
-
集合(set)は順序を持たず、要素の重複を許しません。リストは順序があり、重複も可なので用途によって使い分けます。
- Q2. 和集合と積集合の使いどころは?
-
和集合は全体の要素を一つにまとめたいとき、積集合は共通項を見つけたいときに使います。分析やフィルタ処理に便利です。
- Q3. 集合にリストや辞書を入れることはできますか?
-
いいえ、リストや辞書は変更可能なオブジェクトなので、集合の要素にはできません。代わりにタプルを使うと良いです。
質問用コンタクトフォーム
この記事はAIを用いて書いた記事です。
人間の目による確認も行っていますが、もし間違い等ありましたらご指摘頂けると大変助かります。