PR
更新:2024/09/16

Pythonのsetの集合演算・リストの重複削除・例題について

ふゅか
ふゅか
ねぇ、ふゅか!Pythonのsetについて知ってる?重複しない要素を扱えるから、リストより便利なときがあるんだよ♪
はるか
はるか
うん、知ってる。集合の概念がベースだね。要素の順番も気にしなくていいし。

1. setとは

Pythonのsetは、重複しない要素のコレクションを管理するデータ型です。リストタプルのように順序を持たず、要素は一意である必要があります。setの使い方や特徴について、順を追って解説します。

1.1. setの基本

setは波括弧 {} を使って定義しますが、空のセットを作るには set() を使用します。波括弧で作る場合は、要素をカンマで区切ります。

# 空のセットを作成
empty_set = set()

# 要素があるセットを作成
fruits = {"apple", "banana", "cherry"}

1.2. 重複を許さない

set は同じ値を複数含むことができません。もし同じ値を追加しようとした場合、無視されます。

# 重複を含むリストからセットを作成
fruits = {"apple", "banana", "apple"}
print(fruits)  # 出力: {'banana', 'apple'}

この例では、「apple」は一度しか含まれません。

1.3. 順序を持たない

set は順序がないため、インデックスを使って要素にアクセスすることはできません。例えば fruits[0] のようなアクセスはエラーになります。

ふゅか
ふゅか
順番は関係ないから、インデックスでアクセスはできないのよ〜。

1.4. 要素の追加と削除

set では要素を追加したり削除したりすることができます。

  • 追加: add() メソッドを使います。
  • 削除: remove()discard() を使います。
fruits = {"apple", "banana"}

# 要素を追加
fruits.add("cherry")
print(fruits)  # 出力: {'apple', 'banana', 'cherry'}

# 要素を削除
fruits.remove("banana")
print(fruits)  # 出力: {'apple', 'cherry'}

# 存在しない要素を削除しようとするとエラーになる
# fruits.remove("banana")  # KeyErrorが発生

# discard()はエラーを出さない
fruits.discard("banana")

仮にキーが存在しなときに、removeメソッドを使った場合次のようになります。

2. 集合演算

set の大きな特徴は、集合に対する演算を効率的に行える点です。代表的な集合演算には、以下のようなものがあります。

  • 和集合 (Union): 2つのセットのすべての要素を結合します。| または union() を使用。
  • 積集合 (Intersection): 2つのセットの共通部分を取り出します。& または intersection() を使用。
  • 差集合 (Difference): 片方のセットにしかない要素を取り出します。“ または difference() を使用。
  • 対称差集合 (Symmetric Difference): どちらか一方にしかない要素を取り出します。^ または symmetric_difference() を使用。

2.1. 基本的な集合の演算

A = {1, 2, 3}
B = {3, 4, 5}

# 和集合
print("和集合",A | B)  # 出力: {1, 2, 3, 4, 5}

# 積集合
print("積集合",A & B)  # 出力: {3}

# 差集合
print("差集合",A - B)  # 出力: {1, 2}

# 対称差集合
print("対称差集合",A ^ B)  # 出力: {1, 2, 4, 5}

2.2. その他

set には便利な関数や演算子がいくつかあります。

  • len(): セットの要素数を返します。
  • in演算子: 要素がセットに含まれているかどうかをチェックします。
fruits = {"apple", "banana", "cherry"}

# 要素数を取得
print(len(fruits))  # 出力: 3

# 要素の存在確認
print("apple" in fruits)  # 出力: True
print("orange" in fruits)  # 出力: False

2.3. 応用: リストの変換による重複削除

set はリストやタプルとの相互変換が可能です。リストの重複要素を削除したいときに便利です。

# リストをセットに変換
my_list = [1, 2, 2, 3, 4, 4]
print(my_list) 
my_set = set(my_list)  # 重複が削除される
print(my_set)  # 出力: {1, 2, 3, 4}

# セットをリストに変換
unique_list = list(my_set)
print(unique_list)  # 出力: [1, 2, 3, 4]

3. 例題

3.1. 例題1:集合の演算

2つの集合 A = {1, 2, 3, 4, 5}B = {3, 4, 5, 6, 7} が与えられています。この2つの集合に対して以下の演算を行い、その結果を求めなさい。
  1. A と B の和集合
  2. A と B の積集合
  3. A と B の差集合(A – B)
  4. A と B の対称差集合

期待される出力:
和集合: {1, 2, 3, 4, 5, 6, 7}
積集合: {3, 4, 5}
差集合: {1, 2}
対称差集合: {1, 2, 6, 7}

解答の手順:

  1. 和集合: 2つの集合のすべての要素を結合するために、| または union() メソッドを使用します。
    union_result = A.union(B)
  2. 積集合: 2つの集合に共通する要素を取り出すために、& または intersection() メソッドを使用します。
    intersection_result = A.intersection(B)
  3. 差集合: AにあってBにない要素を取り出すために、“ または difference() メソッドを使用します。
    difference_result = A.difference(B)
  4. 対称差集合: AとBのどちらか一方にのみ存在する要素を取り出すために、^ または symmetric_difference() メソッドを使用します。
    symmetric_difference_result = A.symmetric_difference(B)

解答:

A = {1, 2, 3, 4, 5}
B = {3, 4, 5, 6, 7}

# 和集合
union_result = A.union(B)
print("和集合:", union_result)

# 積集合
intersection_result = A.intersection(B)
print("積集合:", intersection_result)

# 差集合
difference_result = A.difference(B)
print("差集合:", difference_result)

# 対称差集合
symmetric_difference_result = A.symmetric_difference(B)
print("対称差集合:", symmetric_difference_result)

3.2. 例題2:文字列の集合

2つの集合 A = {"apple", "banana", "cherry", "date", "elderberry"}B = {"cherry", "date", "fig", "grape", "banana"} が与えられています。この2つの集合に対して以下の演算を行い、その結果を求めなさい。
  1. A と B の和集合
  2. A と B の積集合
  3. A と B の差集合(A – B)
  4. A と B の対称差集合

期待される出力:
和集合: {'apple', 'banana', 'cherry', 'date', 'elderberry', 'fig', 'grape'}
積集合: {'cherry', 'date', 'banana'}
差集合: {'apple', 'elderberry'}
対称差集合: {'apple', 'elderberry', 'fig', 'grape'}

解答の手順:

  1. 和集合: 2つの集合のすべての要素を結合するために、| または union() メソッドを使用します。
    union_result = A | B
    
  2. 積集合: 2つの集合に共通する要素を取り出すために、& または intersection() メソッドを使用します。
    intersection_result = A & B
    
  3. 差集合: AにあってBにない要素を取り出すために、“ または difference() メソッドを使用します。
    difference_result = A - B
    
  4. 対称差集合: AとBのどちらか一方にのみ存在する要素を取り出すために、^ または symmetric_difference() メソッドを使用します。
    symmetric_difference_result = A ^ B
    

解答:

A = {"apple", "banana", "cherry", "date", "elderberry"}
B = {"cherry", "date", "fig", "grape", "banana"}

# 和集合
union_result = A | B
print("和集合:", union_result)

# 積集合
intersection_result = A & B
print("積集合:", intersection_result)

# 差集合
difference_result = A - B
print("差集合:", difference_result)

# 対称差集合
symmetric_difference_result = A ^ B
print("対称差集合:", symmetric_difference_result)


check

Pythonの基本から応用まで、幅広くカバーする記事を公開中です。学習のポイントや実践的なコード例を通じて、Pythonの魅力と実用性を深く理解することができます。ぜひ、こちらの記事で気になる記事を見つけてください!

Pythonの記事のまとめ

PR