
こんにちは! 株式会社キカガク認定講師の前田晋弥です。
私自身、キカガクの長期コース受講期間中に、 AI 搭載の自作アプリケーションを作成したり、 E 資格を取得したりしました。
プログラミングを学習中の皆さまは、重複のあるデータから重複のないデータを抽出したいと思うことはありませんか?
その場合は、 Python の set というデータ構造を使用することで簡単にできます!
本記事では、 Python の set の使い方を解説しますので、ぜひ最後まで読んでみてくださいね!
目次
Python の set は、数学で扱う「集合」に似たデータ型で、特に以下の基本概念と特徴を持っています。
# 重複しないデータ fruits = {"apple", "banana", "apple", "cherry"} print(fruits) # 結果: {"apple", "banana", "cherry"}
Python のデータ型である set 、 list 、 tuple にはそれぞれ異なる特徴と用途があります。以下に、 set と list 、 tuple の違いをまとめてみます。
1.重複の有無
特徴 | リスト( list ) | タプル( tuple ) | セット( set ) |
|---|---|---|---|
重複 | 許される | 許される | 許されない |
順序 | 保持される | 保持される | 保持されない |
変更可能性 | 変更可能 | 変更不可能 | 変更可能 |
主な用途 | 順序を持つデータ | 不変のデータ | 重複の無いデータ |
集合演算 | 遅い | 遅い | 速い |
リスト( list )とタプル( tuple )、セット( set )の違い
波かっこ {} を使うと、簡単に set を作成することができます。波かっこの中に要素をコンマで区切って並べるだけです。
# 空でない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を作成 empty_set = set() print(empty_set) # 結果: set()
set() 関数を使うと、リストやタプルなどのシーケンスから set を作成できます。これにより、リストやタプルの重複した要素を簡単に排除することができます。
my_list = [1, 2, 2, 3, 4] my_set = set(my_list) print(my_set) # 結果: {1, 2, 3, 4}
my_tuple = (1, 2, 2, 3, 4) my_set = set(my_tuple) print(my_set) # 結果: {1, 2, 3, 4}
add() メソッドは、 set に新しい要素を 1 つ追加します。 list や tuple のように直接インデックスで追加するのではなく、集合に新しい要素を追加する形です。要素がすでにセットに含まれている場合は無視され、重複は発生しません。
my_set = {1, 2, 3} my_set.add(4) print(my_set) # 結果: {1, 2, 3, 4}
remove() メソッドは、 set から指定した要素を削除します。
my_set = {1, 2, 3} my_set.remove(2) print(my_set) # 結果: {1, 3}
もし指定した要素がセットに存在しない場合はエラー( KeyError )が発生します。
my_set.remove(4) # エラー: KeyError
discard() メソッドも set から要素を削除しますが、 remove() と違って、指定した要素が存在しなくてもエラーは発生しません。存在していれば削除し、存在しなければそのまま無視されます。
my_set = {1, 2, 3} my_set.discard(2) print(my_set) # 結果: {1, 3} my_set.discard(4) # 存在しない要素を削除しようとしてもエラーは発生しない print(my_set) # 結果: {1, 3}
union() メソッドは、 2 つ以上の set を結合して、新しいセットを作成します。結果として返されるセットには、すべての要素が含まれますが、重複した要素は 1 つだけ保持されます。
set1 = {1, 2, 3} set2 = {3, 4, 5} result_set = set1.union(set2) print(result_set) # 結果: {1, 2, 3, 4, 5}
union() は元のセットを変更せず、新しいセットを返します。| 演算子を使っても同じ結果が得られます。
result_set = set1 | set2 print(result_set) # 結果: {1, 2, 3, 4, 5}
リストには重複した要素が含まれることがありますが、 set を使うと重複を簡単に排除できます。 set は重複を許さないので、リストを set に変換することで重複した要素が自動的に削除されます。
# 重複を含むリスト 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 の要素数がそのままユニークな要素の数を表します。
# 重複を含むリスト 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
和集合は、 2 つ以上の set に含まれるすべての要素を結合し、重複を除いて 1 つのセットにまとめたものです。
# 2つのセットを作成 set1 = {1, 2, 3} set2 = {3, 4, 5} # 和集合を求める union_set = set1.union(set2) print(union_set) # 結果: {1, 2, 3, 4, 5}
union_set = set1 | set2 print(union_set) # 結果: {1, 2, 3, 4, 5}
差集合は、 1 つ目の set に含まれていて、 2 つ目の set には含まれていない要素だけを含む集合です。
# 2つのセットを作成 set1 = {1, 2, 3} set2 = {3, 4, 5} # 差集合を求める(set1 - set2) difference_set = set1.difference(set2) print(difference_set) # 結果: {1, 2}
difference_set = set1 - set2 print(difference_set) # 結果: {1, 2}
積集合は、両方の set に共通して含まれている要素だけを含む集合です。
# 2つのセットを作成 set1 = {1, 2, 3} set2 = {3, 4, 5} # 積集合を求める intersection_set = set1.intersection(set2) print(intersection_set) # 結果: {3}
intersection_set = set1 & set2 print(intersection_set) # 結果: {3}
Python の set を使って、テキストからユニークな単語(重複しない単語)を抽出する実践的な例を紹介します。 set は重複を排除するデータ型なので、単語を重複なくリスト化したい場合に非常に便利です。
# テキスト 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 の set を使って、簡単なゲームの例を作ってみましょう。ここでは、「数字当てゲーム」を紹介します。このゲームでは、プレイヤーが複数回入力した数字のうち、まだ出ていない数字を推測するゲームです。 set を使って、すでに入力された数字を管理し、重複しないように処理します。
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("有効な数字を入力してください。")
こちらの数字あてゲームでは、 random モジュールが出てきていますが、 Python の random モジュールの使い方については、以下の記事を参考にしてみてください!
Python の set は便利なデータ型ですが、使う際にはいくつかの注意点があります。これらのポイントを理解しておくと、思わぬエラーやパフォーマンス問題を避けることができます。 set を使用するときの重要な注意点をわかりやすく説明します。
set は順序のないデータ型です。つまり、セット内の要素の順番は保証されません。要素を追加した順番通りには表示されないことが多いです。
set は重複する要素を持てません。もし同じ要素を 2 回追加しても、セットには 1 つだけしか残りません。
set には変更可能なデータ型(リストなど)を要素として追加することができません。これは、 set がデータの一意性を保証するために、要素が変更されると一意性の管理が難しくなるからです。
set は順序がないため、インデックスを使って要素にアクセスすることができません。リストのように my_set[0] のように使おうとするとエラーになります。
set では、和集合、積集合、差集合などの集合演算が可能です。ただし、元のセットに影響を与えず、新しいセットを作成する場合は、 union() や intersection() のようなメソッドを使います。演算子( | , & , - )を使うと、結果が新しいセットとして返されますが、元のセットは変更されません。
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 の set について学んできましたが、いかがでしたでしょうか?
さらに Python を学んでみたいという方は、ぜひキカガクの無料コースの受講をおすすめします!
また、今後 AI が必須のリテラシーとなる昨今、機械学習に興味のお持ちの方は、キカガクの長期コースの受講もおすすめです!
2024 年 10 月より、給付金が増えたことで、さらに受講しやすくなりました!
SHARE
AI/データサイエンス学びはじめの方におすすめの記事
コース一覧
注目記事
新着記事
目次