kurumi-bioの雑記帳

プログラミング、パソコン、ペット、 犬、お出かけ

ChatGPTでプログラミングを学ぼう 第8回 「Pythonのセット型の操作」

こんにちは、kurumi-bioです。

ChatGPTと会話しながらPythonを学んでいきます。

環境

前回の振り返り

前回は、Pythonのタプル型の操作のついて学習しました。
タプル型は要素の追加、削除、変更が不可能 ということがわかりました。

kurumi-bio.hatenablog.com

学習内容

今回は、セット型の操作を学習します。
簡単な操作が多いので、対話モードで学習していきます。

Pythonのセット型の操作

Pythonのセット型の操作をChatGPTに聞いてみました。

要素の追加

◆対話モード

kurumi@localhost:~/python> python3
Python 3.6.15 (default, Sep 23 2021, 15:41:43) [GCC] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> my_set={1,2,3,4}
>>> type(my_set)
<class 'set'>
>>> print(my_set)
{1, 2, 3, 4}
>>> my_set.add(5)
>>> print(my_set)
{1, 2, 3, 4, 5}
>>> 

実行結果の説明 セット型のmy_setオブジェクトを作成しました。
my_setオブジェクトは、1,2,3,4の3つの整数を含んでいます。
addメソッドで5を追加したため、 my_setオブジェクトは、1,2,3,4,5の5つの整数を含むようになりました。

重複した値は追加できません

◆対話モード

>>> my_set={10,5,3,1}
>>> print(my_set)
{1, 10, 3, 5}
>>> my_set.add(10)
>>> print(my_set)
{1, 10, 3, 5}
>>>

実行結果の説明 Pythonのセット型は重複した値を格納することができません。
試しに、10,5,3,1の4つの整数を含むセット型のmy_setオブジェクトを作成し、
addメソッドで既に存在する値10を追加しても、my_setオブジェクトに反映されませんでした。
また、セット型は順番を保持していないため、生成時と出力時で要素の順番が変わっています。

要素の削除

◆対話モード

>>> print(my_set)
{1, 2, 3, 4, 5}
>>> my_set.remove(3)
>>> print(my_set)
{1, 2, 4, 5}
>>> my_set.remove(3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 3
>>> print(my_set)
{1, 2, 4, 5}
>>> my_set.discard(3)
>>> p=my_set.pop()
>>> type(p)
<class 'int'>
>>> print(p)
1
>>> print(my_set)
{2, 4, 5}
>>> 

実行結果の説明 1,2,3,4,5の5つの整数を含むセット型のmy_setオブジェクトを作成しました。
removeメソッドを使って要素3を削除すると、
my_setオブジェクトは、1,2,4,5の4つの整数を含むオブジェクトになりました。
この状態で、もう一度removeメソッドで要素3を削除すると存在しないためエラーが発生しました。

同じmt_setオブジェクトでdiscardメソッドを使って要素3の削除をすると、
removeメソッドと異なりエラーになりませんでした。

最後にpopメソッドを使って任意の要素の削除と取得を行いました。

セットの結合と更新

◆対話モード

>>> print(my_set)
{2, 4, 5}
>>> my_set2={4,5,6}
>>> s=my_set.union(my_set2)
>>> print(s)
{2, 4, 5, 6}
>>> 
>>> print(my_set)
{2, 4, 5}
>>> print(my_set2)
{4, 5, 6}
>>> my_set.update(my_set2)
>>> print(my_set)
{2, 4, 5, 6}
>>> print(my_set2)
{4, 5, 6}
>>> 

実行結果の説明 2,4,5の要素を含むセット型のmy_setオブジェクトと
4,5,6の要素を含むセット型のmy_set2オブジェクトを
unionメソッドを使って結合した結果をsオブジェクトに代入しました。
その結果、sオブジェクトは、重複要素が除外された2,4,5,6の4つの整数を含むオブジェクトになりました。

unionメソッドでは、元のオブジェクトは変更されませんが、
updateメソッドを使うと、メソッドを使ったオブジェクトの値が変更されました。

広告の下に続きます。

セットの積集合と更新

◆対話モード

>>> my_set1={1,2,3,4}
>>> my_set2={5,6,7,8}
>>> my_set3={3,4,5}
>>> my_set1.intersection(my_set2)
set()
>>> my_set1.intersection(my_set3)
{3, 4}
>>> my_set2.intersection(my_set3)
{5}
>>> print(my_set1)
{1, 2, 3, 4}
>>> my_set1.intersection_update(my_set2)
>>> print(my_set1)
set()
>>> print(my_set2)
{8, 5, 6, 7}
>>> my_set2.intersection_update(my_set3)
>>> print(my_set2)
{5}
>>> 

実行結果の説明 intersectionメソッドを使うと、二つのセットオブジェクトの共通要素が取得できます。
my_set1オブジェクトとmy_set2オブジェクトは、共通要素が無いため空のセットが返ってきました。
my_set1オブジェクトとmy_set3オブジェクトは、3,4が共通要素として返ってきました。
my_set2オブジェクトとmy_set3オブジェクトは、5が共通要素として返ってきました。

intersectionメソッドでは元のオブジェクトは変更されませんが、
intersection_updateメソッドを使うと、メソッドを使ったオブジェクトの値が変更されました。

セットの差集合と更新

◆対話モード

>>> my_set1={1,2,3,4}
>>> my_set2={2,4}
>>> my_set1.difference(my_set2)
{1, 3}
>>> my_set2.difference(my_set1)
set()
>>> 

実行結果の説明 differenceメソッドを使うと、他のセットオブジェクトの要素を取り除いた要素が取得できます。
my_set1オブジェクトからmy_set2オブジェクトの要素を取り除くと1,3要素が返ってきました。
my_set2オブジェクトからmy_set1オブジェクトの要素を取り除くと空のセットが返ってきました。

他と同じなので対話モードでは、割愛しましたが、
differenceメソッドでは元のオブジェクトは変更されませんが、
difference_updateメソッドを使うと、メソッドを使ったオブジェクトの値が変更されます。

セットの対象差と更新

◆対話モード

>>> my_set1={1,2,3,4}
>>> my_set2={2,4,6}
>>> my_set1.symmetric_difference(my_set2)
{1, 3, 6}
>>> my_set2.symmetric_difference(my_set1)
{1, 3, 6}
>>> 

実行結果の説明 symmetric_differenceメソッドを使うと、どちらかだけに含まれる要素が取得できます。
my_set1オブジェクトとmy_set2オブジェクトのどちらかに含まれる要素として、1,3,6要素が返ってきました。
my_set2オブジェクトでsymmetric_differenceメソッドを使っても同じ結果になりました。

他と同じなので対話モードでは、割愛しましたが、
symmetric_differenceメソッドでは元のオブジェクトは変更されませんが、
symmetric_difference_updateメソッドを使うと、メソッドを使ったオブジェクトの値が変更されます。

セットの部分集合と上位集合の判定

部分集合

◆対話モード

>>> my_set1={1,2,3,4}
>>> my_set2={4,5,6,7}
>>> my_set3={1,4}
>>> my_set1.issubset(my_set2)
False
>>> my_set1.issubset(my_set3)
False
>>> my_set3.issubset(my_set1)
True
>>> my_set3.issubset(my_set2)
False

実行結果の説明 issubsetメソッドを使うと、自身の全ての要素が指定したセットに含まれているか判定できます。
my_set3オブジェクトがmy_set1オブジェクトの部分集合になっていることがわかりました。

上位集合

◆対話モード

>>> my_set1={1,2,3,4}
>>> my_set2={4,5,6,7}
>>> my_set3={1,4}
>>> my_set1.issuperset(my_set2)
False
>>> my_set1.issuperset(my_set3)
True
>>> my_set3.issuperset(my_set1)
False
>>> my_set3.issuperset(my_set2)
False
>>> 

実行結果の説明 issupersetメソッドを使うと、指定したセットに自身の全ての要素が含まれているか判定できます。
my_set1オブジェクトにmy_set3の要素が全て含まれていることがわかりました。

セットの要素数とクリア

◆対話モード

>>> my_set={}
>>> my_set2={1,2}
>>> len(my_set)
0
>>> len(my_set2)
2
>>> my_set2.clear()
>>> len(my_set2)
0
>>> print(my_set2)
set()
>>> 

実行結果の説明 len関数を使うとセットオブジェクトの要素数がわかりました。 clear関数を使うとセットオブジェクトが空になることがわかりました。

その他

ChatGPTの回答に無いけど、リスト型とタプル型で使用できた操作が使えるか確認してみました。

コピー関数

◆対話モード

>>> my_set1={1,2,3}
>>> my_set2=my_set1.copy()
>>> print(my_set2)
{1, 2, 3}
>>> my_set3=my_set1
>>> print(my_set3)
{1, 2, 3}

実行結果の説明 copyメソッドを使って同じオブジェクトが作成されることが確認できました。

sorted関数

◆対話モード

>>> my_set1={1,2,4,8,16,32,64,128}
>>> print(my_set1)
{32, 1, 2, 64, 4, 128, 8, 16}
>>> sorted(my_set1)
[1, 2, 4, 8, 16, 32, 64, 128]
>>> print(my_set1)
{32, 1, 2, 64, 4, 128, 8, 16}
>>> 

実行結果の説明 sorted関数を使って、ソートした要素が返されることが確認できました。
元要素の順番は変わっていません。

max関数,min関数

◆対話モード

>>> my_set1={1,2,4,8,16,32,64,128}
>>> max(my_set1)
128
>>> min(my_set1)
1

実行結果の説明 要素内の最大値と最小値が返されることが確認できました。

検索(in)

◆対話モード

>>> my_set1={1,2,4,8,16,32,64,128}
>>> 4 in my_set1
True
>>> 5 in my_set1
False
>>> 

実行結果の説明 指定した要素が含まれているか判定できました。

比較

◆対話モード

>>> my_set1={1,2,3}
>>> my_set2={4,5,6}
>>> my_set3={2,3}
>>> my_set4={1,2,3}
>>> print(my_set1 == my_set2)
False
>>> print(my_set1 == my_set3)
False
>>> print(my_set1 == my_set4)
True
>>>

実行結果の説明 全要素が同じ場合のみ同一と判定されました。

反復処理

◆対話モード

>>> my_set1={1,2,4,8,16,32,64,128}
>>> for item in my_set1:print(item)
... 
32
1
2
64
4
128
8
16
>>>

実行結果の説明 for文を使ってmy_set1オブジェクトの全要素を出力することができました。

操作比較

リスト型とタプル型で、どの操作が可能かを表にしました。

リスト型 タプル型 セット型
インデックス変更 × ×
インデックス取得 ×
appendメソッド × addメソッド
insertメソッド × ×
extendメソッド × ×
removeメソッド ×
popメソッド ×
clearメソッド ×
reverseメソッド × ×
sortメソッド × ×
copyメソッド ×
indexメソッド ×
countメソッド ×
len関数
sorted関数
max関数
min関数
結合(+) ×
検索(in)
スライス ×
比較
反復処理(for in)

リスト型は要素の追加、削除、変更が可能
タプル型は要素の追加、削除、変更が不可能
セット型は要素の追加、削除が可能、インデックス指定が不可能
ということがわかりました。

残課題

  • 辞書型の操作
  • モジュール型とユーザー定義型
  • open関数の構文と使い方
  • 構文中の":"と";"の意味

最後までご覧いただきありがとうございます