【Python入門】データ管理の強力な味方! set の使い方を機械学習講師が解説!

データ管理の強力な味方!set の使い方を機械学習講師が解説!

こんにちは! 株式会社キカガク認定講師の前田晋弥です。
私自身、キカガクの長期コース受講期間中に、 AI 搭載の自作アプリケーションを作成したり、 E 資格を取得したりしました。

プログラミングを学習中の皆さまは、重複のあるデータから重複のないデータを抽出したいと思うことはありませんか?
その場合は、 Python の set というデータ構造を使用することで簡単にできます!

本記事では、 Python の set の使い方を解説しますので、ぜひ最後まで読んでみてくださいね!

set とは? Python のユニークなデータ構造を知ろう

set の基本概念と特徴

Python の set は、数学で扱う「集合」に似たデータ型で、特に以下の基本概念と特徴を持っています。

  1. 重複しないデータ
    set は、重複する要素を持つことができません。リストやタプルと違って、同じ値が複数入っても 1 つにまとめられます。これにより、重複を自動的に排除したい場合に便利です。
  2. 順序がない
    set の要素には順序がありません。リストのように要素の順番を気にしなくてもいいですが、インデックス(番号)でアクセスできないため、要素を取得する方法が少し違います。
  3. 変更可能(ミュータブル)
    set の要素を追加したり削除したりできます。ただし、セットの中に入れる要素自体は変更できない(不変・イミュータブルな)データ型である必要があります。例えば、リスト(ミュータブル)は入れられませんが、タプル(イミュータブル)は入れることができます。(※リストやタプルについては、次節で説明しています。)
Python
# 重複しないデータ
fruits = {"apple", "banana", "apple", "cherry"}
print(fruits)  # 結果: {"apple", "banana", "cherry"}

list や tuple との違い

Python のデータ型である set 、 list 、 tuple にはそれぞれ異なる特徴と用途があります。以下に、 set と list 、 tuple の違いをまとめてみます。

1.重複の有無

  • リスト( list ):重複した要素を持つことができます。例えば、 [1, 2, 2, 3] のように、同じ要素が複数回現れることが許されます。
  • タプル( tuple ):リストと同様に、重複を許すデータ型です。例えば、 (1, 2, 2, 3) という形で重複が可能です。
  • セット( set ):重複を許しません。 set に同じ要素が 2 つ以上入ることはなく、重複する要素は自動的に排除されます。例えば、 {1, 2, 2, 3} は実際には {1, 2, 3} として扱われます。

2.順序の有無

  • リスト( list ):要素の順序が保持されます。リストに要素を追加した順番通りに保存され、アクセスもインデックス番号で行います。例えば、 my_list[0] でリストの最初の要素にアクセスできます。
  • タプル( tuple ):タプルも要素の順序を保持します。インデックスを使ってmy_tuple[0]のようにアクセスできます。
  • セット( set ):要素の順序は保証されません。 set の要素はランダムな順序で並ぶ可能性があるため、インデックスを使ったアクセスはできません。要素の順番が重要でない場合に使われます。

3.変更可能かどうか(ミュータブル/イミュータブル)

  • リスト( list ):変更可能です(ミュータブル)。リストに要素を追加したり削除したり、特定の位置の要素を変更することができます。
  • タプル( tuple ):変更不可能です(イミュータブル)。一度作成したタプルは変更できません。要素を追加したり削除したり、値を変更することはできません。
  • セット( set ):変更可能です(ミュータブル)。要素の追加や削除が可能ですが、要素自体は変更不可能な(イミュータブル)オブジェクトである必要があります(数値や文字列など)。

4.使用目的やシチュエーション

  • リスト( list ):順序が重要な場合や、データの追加や削除を頻繁に行う場面でよく使われます。例えば、順番に並んだタスクのリストや、注文の履歴などを扱うのに適しています。
  • タプル( tuple ):変更する必要がないデータの集合を扱うときに使います。例えば、位置情報(緯度、経度のペア)や日付(年、月、日)など、一度設定したら変わらないものに適しています。
  • set :重複を排除したい場合や、順序が必要でないときに便利です。例えば、複数のデータセットの共通項や、ユニークな値だけを取り扱いたいときに有効です。

5.高速な集合演算

  • セット( set ): set は、集合(数学的な意味での「集合」)の演算を高速に処理するのが特徴です。例えば、 2 つの set の和集合、積集合、差集合を簡単に求めることができます。 list や tuple ではこれを行うのは効率が悪い場合があります。
特徴リスト( list )タプル( tuple )セット( set )
重複許される許される許されない
順序保持される保持される保持されない
変更可能性変更可能
(ミュータブル)
変更不可能
(イミュータブル)
変更可能
(ミュータブル)
主な用途順序を持つデータ
の管理
不変のデータ
の管理
重複の無いデータ
の管理
集合演算遅い遅い速い
リスト( list )とタプル( tuple )、セット( set )の違い

set の作成方法

波括弧 {} を使った作成

波かっこ {} を使うと、簡単に set を作成することができます。波かっこの中に要素をコンマで区切って並べるだけです。

Python
# 空でないsetを波かっこで作成
my_set = {1, 2, 3, 4}
print(my_set)  # 結果: {1, 2, 3, 4}

# 重複した要素があっても、setでは重複が自動的に削除されます
my_set = {1, 2, 2, 3}
print(my_set)  # 結果: {1, 2, 3}

set では重複した要素が自動的に排除されます。

順序は保証されないため、表示される順番は異なる場合があります。

set() 関数を使った作成

set() 関数を使うと、空の set を作成したり、リストやタプルなど他のデータ型を set に変換することができます。

Python
# 空のsetを作成
empty_set = set()
print(empty_set)  # 結果: set()

リストやタプルからの変換

set() 関数を使うと、リストやタプルなどのシーケンスから set を作成できます。これにより、リストやタプルの重複した要素を簡単に排除することができます。

リストから set 作成

Python
my_list = [1, 2, 2, 3, 4]
my_set = set(my_list)
print(my_set)  # 結果: {1, 2, 3, 4}

リストに重複した要素が含まれていても、 set に変換すると重複が排除されます。

タプルから set 作成

Python
my_tuple = (1, 2, 2, 3, 4)
my_set = set(my_tuple)
print(my_set)  # 結果: {1, 2, 3, 4}

タプルも同様に、重複した要素が set に変換されると排除されます。

set の主要な操作

要素の追加( add メソッド)

add() メソッドは、 set に新しい要素を 1 つ追加します。 list や tuple のように直接インデックスで追加するのではなく、集合に新しい要素を追加する形です。要素がすでにセットに含まれている場合は無視され、重複は発生しません。

Python
my_set = {1, 2, 3}
my_set.add(4)
print(my_set)  # 結果: {1, 2, 3, 4}

もし 4 がすでにセットにあった場合、重複は許されないので追加されません。

要素の削除( remove , discard メソッド)

remove() メソッドは、 set から指定した要素を削除します。

Python
my_set = {1, 2, 3}
my_set.remove(2)
print(my_set)  # 結果: {1, 3}

もし指定した要素がセットに存在しない場合はエラー( KeyError )が発生します。

Python
my_set.remove(4)  # エラー: KeyError

discard() メソッドも set から要素を削除しますが、 remove() と違って、指定した要素が存在しなくてもエラーは発生しません。存在していれば削除し、存在しなければそのまま無視されます。

Python
my_set = {1, 2, 3}
my_set.discard(2)
print(my_set)  # 結果: {1, 3}

my_set.discard(4)  # 存在しない要素を削除しようとしてもエラーは発生しない
print(my_set)  # 結果: {1, 3}

discard() メソッドは、要素が存在しない場合でもエラーが起きないため、安全に削除を試みることができます。

set の結合( union メソッド)

union() メソッドは、 2 つ以上の set を結合して、新しいセットを作成します。結果として返されるセットには、すべての要素が含まれますが、重複した要素は 1 つだけ保持されます。

Python
set1 = {1, 2, 3}
set2 = {3, 4, 5}
result_set = set1.union(set2)
print(result_set)  # 結果: {1, 2, 3, 4, 5}

union() は元のセットを変更せず、新しいセットを返します。| 演算子を使っても同じ結果が得られます。

Python
result_set = set1 | set2
print(result_set)  # 結果: {1, 2, 3, 4, 5}

set の便利な使い方:重複排除

リストから重複を取り除く

リストには重複した要素が含まれることがありますが、 set を使うと重複を簡単に排除できます。 set は重複を許さないので、リストを set に変換することで重複した要素が自動的に削除されます。

Python
# 重複を含むリスト
my_list = [1, 2, 2, 3, 4, 4, 5]

# リストをsetに変換して重複を排除
unique_set = set(my_list)

# 結果を再びリストに変換(元のリスト形式に戻す)
unique_list = list(unique_set)

print(unique_list)  # 結果: [1, 2, 3, 4, 5]

set に変換すると自動的に重複が削除されますが、順序が保持されないため、元の順序にこだわらない場合に便利です。

ユニークな値のカウント

set を使うと、リスト内のユニークな(重複しない)要素がいくつあるのかを簡単にカウントすることができます。 set の要素数がそのままユニークな要素の数を表します。

Python
# 重複を含むリスト
my_list = [1, 2, 2, 3, 4, 4, 5]

# リストをsetに変換してユニークな要素のみを取得
unique_set = set(my_list)

# ユニークな要素の数を取得
unique_count = len(unique_set)

print(f"ユニークな要素の数: {unique_count}")  # 結果: ユニークな要素の数: 5

len(set(my_list)) の結果は、リスト内の重複を取り除いた後のユニークな要素の数です。

set の演算:数学的な集合操作を簡単に

和集合( union )

和集合は、 2 つ以上の set に含まれるすべての要素を結合し、重複を除いて 1 つのセットにまとめたものです。

Python
# 2つのセットを作成
set1 = {1, 2, 3}
set2 = {3, 4, 5}

# 和集合を求める
union_set = set1.union(set2)

print(union_set)  # 結果: {1, 2, 3, 4, 5}

union() メソッドの代わりに、 | 演算子を使って、 2 つのセットの和集合を求めることもできます。

Python
union_set = set1 | set2
print(union_set)  # 結果: {1, 2, 3, 4, 5}

差集合( difference )

差集合は、 1 つ目の set に含まれていて、 2 つ目の set には含まれていない要素だけを含む集合です。

Python
# 2つのセットを作成
set1 = {1, 2, 3}
set2 = {3, 4, 5}

# 差集合を求める(set1 - set2)
difference_set = set1.difference(set2)

print(difference_set)  # 結果: {1, 2}

difference() メソッドの代わりに、 – 演算子を使って、 1 つ目のセットから 2 つ目のセットに含まれていない要素だけを取得することもできます。

Python
difference_set = set1 - set2
print(difference_set)  # 結果: {1, 2}

積集合( intersection )

積集合は、両方の set に共通して含まれている要素だけを含む集合です。

Python
# 2つのセットを作成
set1 = {1, 2, 3}
set2 = {3, 4, 5}

# 積集合を求める
intersection_set = set1.intersection(set2)

print(intersection_set)  # 結果: {3}

intersection() メソッドの代わりに、 & 演算子を使って、 2 つのセットに共通する要素(ここでは 3 )を取得することもできます。

Python
intersection_set = set1 & set2
print(intersection_set)  # 結果: {3}

set を使った実践的な例:コードで学ぶ活用法

ユニークな単語の抽出

Python の set を使って、テキストからユニークな単語(重複しない単語)を抽出する実践的な例を紹介します。 set は重複を排除するデータ型なので、単語を重複なくリスト化したい場合に非常に便利です。

ステップ:

  1. テキストを単語に分割する。
  2. 単語を set に変換して、重複を排除する。
  3. 必要に応じて、単語のリストに戻して表示する。
Python
# テキスト
text = "Python is easy to learn. Python is powerful and fast."

# テキストを単語に分割 (スペースで分ける)
words = text.split()

# 小文字に変換して重複を無視する("Python" と "python" を同じとみなす)
words = [word.lower().strip(".") for word in words]

# 単語のセットを作成して重複を排除
unique_words = set(words)

# 結果を表示
print(unique_words)    # 結果: {'learn', 'python', 'is', 'powerful', 'and', 'fast', 'easy', 'to'}

小文字に統一する: “Python” と “python” のように、大文字・小文字の違いを無視したい場合には、単語を全て小文字に変換することで対処できます。

句読点の削除:文末のピリオドなども単語として扱われてしまうので、 strip() を使って除去します。

数字あてゲーム

Python の set を使って、簡単なゲームの例を作ってみましょう。ここでは、「数字当てゲーム」を紹介します。このゲームでは、プレイヤーが複数回入力した数字のうち、まだ出ていない数字を推測するゲームです。 set を使って、すでに入力された数字を管理し、重複しないように処理します。

ゲームのルール

  1. プレイヤーは 1 から 10 までの数字を推測して入力します。
  2. プレイヤーがすでに推測した数字は、 set を使って記録され、再度同じ数字を入力できないようにします。
  3. プレイヤーがまだ入力していない数字を当てるまでゲームが続きます。
Python
import random

# ゲームで使用するセット
all_numbers = set(range(1, 11))  # 1〜10までの数字のセット
guessed_numbers = set()  # プレイヤーが既に推測した数字を記録するセット

# ランダムにターゲット数字を選ぶ
target_number = random.choice(list(all_numbers))

print("1から10の数字を当ててください!")

# ゲームループ
while True:
    try:
        # ユーザーの入力を取得
        guess = int(input("数字を入力してください: "))

        # 入力が範囲外の場合のチェック
        if guess < 1 or guess > 10:
            print("1から10の数字を入力してください。")
            continue

        # 同じ数字を再入力していないかチェック
        if guess in guessed_numbers:
            print("その数字はもう推測しています!別の数字を選んでください。")
            continue

        # 新しい推測として記録
        guessed_numbers.add(guess)

        # 正解かどうかをチェック
        if guess == target_number:
            print(f"おめでとう!正解は {target_number} です!")
            break
        else:
            print("違います。もう一度試してください。")
            print(f"これまでに推測した数字: {guessed_numbers}")

    except ValueError:
        print("有効な数字を入力してください。")

コードの説明

  • all_numbers セット: 1 から 10 までの数字を持つセットです。ゲームの範囲を定義しています。
  • guessed_numbers セット:プレイヤーがすでに推測した数字を記録するためのセットです。重複する推測を防ぎます。
  • random.choice() : all_numbers からランダムに 1 つの数字を選び、プレイヤーが当てるべきターゲット数字を設定します。
  • while True ループ:プレイヤーが正しい数字を当てるまでゲームが繰り返されます。
  • 入力チェック:プレイヤーが 1 から 10 の範囲外の数字を入力した場合や、すでに入力した数字を再度入力した場合は警告メッセージが表示され、再入力を求められます。

こちらの数字あてゲームでは、 random モジュールが出てきていますが、 Python の random モジュールの使い方については、以下の記事を参考にしてみてください!

プレイの流れ

  1. プログラムが「 1 から 10 の数字を当ててください!」と表示。
  2. プレイヤーが数字を入力。
  3. すでに推測した数字であれば、「その数字はもう推測しています!」と表示し、再入力を促す。
  4. プレイヤーが正解すれば「おめでとう!正解は XX です!」と表示してゲーム終了。

set を使うことで、すでに推測した数字の重複を防ぎ、簡単なロジックでゲームを構築できます。

set の注意点

Python の set は便利なデータ型ですが、使う際にはいくつかの注意点があります。これらのポイントを理解しておくと、思わぬエラーやパフォーマンス問題を避けることができます。 set を使用するときの重要な注意点をわかりやすく説明します。

要素の順序は保持されない

set は順序のないデータ型です。つまり、セット内の要素の順番は保証されません。要素を追加した順番通りには表示されないことが多いです。

順序を保持したい場合は、リストやタプルを使用してください。 set は順序が重要でない場面で使うのが適しています。

重複した要素は自動的に排除される

set は重複する要素を持てません。もし同じ要素を 2 回追加しても、セットには 1 つだけしか残りません。

リストやタプルのように重複を許したい場合は set を使わないでください。重複を排除したいときに set を使うのが適しています。

ミュータブルなオブジェクト(変更可能なオブジェクト)はセットに追加できない

set には変更可能なデータ型(リストなど)を要素として追加することができません。これは、 set がデータの一意性を保証するために、要素が変更されると一意性の管理が難しくなるからです。

リストや辞書など、変更可能なデータ型をセットの要素として使いたい場合は、それをタプル(tuple)に変換する必要があります。タプルは不変(イミュータブル)なので、セットに追加できます。

要素のインデックスアクセスができない

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

要素にアクセスする場合は、 for ループを使って全ての要素を順番に処理するか、リストに変換してからアクセスしてください。

集合演算に対する注意

set では、和集合、積集合、差集合などの集合演算が可能です。ただし、元のセットに影響を与えず、新しいセットを作成する場合は、 union() や intersection() のようなメソッドを使います。演算子( | , & , – )を使うと、結果が新しいセットとして返されますが、元のセットは変更されません。

Python
set1 = {1, 2, 3}
set2 = {3, 4, 5}

# 新しいセットが返され、元のセットはそのまま
result_set = set1 | set2  # 和集合
print(result_set)  # 結果: {1, 2, 3, 4, 5}
print(set1)  # 元のセット: {1, 2, 3}

まとめ

最後までお読みいただき、ありがとうございました。
ここまで set の基本概念と特徴から、 set を使った実践的な例や注意点について学んできました。

ぜひ、ご自身でもサンプルの Python コードを Google Colaboratory 等にコピーしてみて、どのように動作するのか確認してみてください。
Google Colaboratory の使い方については、以下の記事を参考にしてみてください。

次のステップ:さらなる Python スキル向上のために

ここまで、 Python の set について学んできましたが、いかがでしたでしょうか?

さらに Python を学んでみたいという方は、ぜひキカガクの無料コースの受講をおすすめします!

また、今後 AI が必須のリテラシーとなる昨今、機械学習に興味のお持ちの方は、キカガクの長期コースの受講もおすすめです!
2024 年 10 月より、給付金が増えたことで、さらに受講しやすくなりました!