▲セット (set)

セットについて説明します。

参考

セット集合)は、リストと同様に複数の要素から構成されるデータです。 セットでは、リストと異なり要素の重複がありません、また要素の順番もありません。

セットを作成するには、次のように波括弧で要素を囲みます。 辞書と似ていますが、辞書では : でキーと値を対応させる必要がありました。

[1]:
set1= {2, 1, 2, 3, 2, 3, 1, 3, 3, 1}
set1
[1]:
{1, 2, 3}
[2]:
type(set1)
[2]:
set

セットのデータ型は set であり、set は組み込み関数でもあります。

組み込み関数 set を用いてもセットを作成することができます。

[3]:
set([2, 1, 2, 3, 2, 3, 1, 3, 3, 1])
[3]:
{1, 2, 3}

空のセットを作成する場合、次のようにします。( {} では空の辞書が作成されます。)

[4]:
set2 = set() # 空のセット
set2
[4]:
set()
[5]:
set2 = {} # 空の辞書
set2
[5]:
{}

set を用いて、文字列、リストやタプルなどからセットを作成することができます。

[6]:
set([1,1,2,2,2,3])
[6]:
{1, 2, 3}
[7]:
set((1,1,2,2,2,3))
[7]:
{1, 2, 3}
[8]:
set('aabdceabdae')
[8]:
{'a', 'b', 'c', 'd', 'e'}
[9]:
set({'apple' : 3, 'pen' : 5})
[9]:
{'apple', 'pen'}

セットの組み込み関数

リストなどと同様に、次の関数などはセットにも適用可能です。

[10]:
len(set1) # 集合を構成する要素数
[10]:
3
[11]:
x,y,z = set1 # 多重代入
x
[11]:
1
[12]:
2 in set1 # 指定した要素を集合が含むかどうかの判定
[12]:
True
[13]:
10 in set1 # 指定した要素を集合が含むかどうかの判定
[13]:
False
[14]:
10 not in set1
[14]:
True

セットの要素は、順序付けられていないのでインデックスを指定して取り出すことはできません。

[15]:
set1[0]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/tmp/ipykernel_7949/2166654704.py in <module>
----> 1 set1[0]

TypeError: 'set' object is not subscriptable

練習

文字列 str1 が引数として与えられたとき、str1 に含まれる要素(文字、すなわち長さ1の文字列)の種類を返す関数 check_characters を作成してください(大文字と小文字は区別し、スペースや句読点も1つと数えます)。 たとえば、'aabccc' には 'a''b''c' が含まれるので、 check_characters('aabccc') は 3 を返します。

以下のセルの ... のところを書き換えて check_characters(str1) を作成してください。

[16]:
def check_characters(str1):
    ...

上のセルで解答を作成した後、以下のセルを実行し、実行結果が True になることを確認してください。

[17]:
print(check_characters('Onde a terra acaba e o mar começa') == 13)
False

練習

辞書 dic1 が引数として与えられたとき、dic1 に登録されているキーの数を返す関数 check_dicsize を作成してください。

以下のセルの ... のところを書き換えて check_dicsize(dic1) を作成してください。

[18]:
def check_dicsize(dic1):
    ...

上のセルで解答を作成した後、以下のセルを実行し、実行結果が True になることを確認してください。

[19]:
print(check_dicsize({'apple': 0, 'orange': 2, 'pen': 1}) == 3)
False

集合演算

複数のセットから、和集合積集合差集合対称差を求める集合演算が存在します。

[20]:
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}
[21]:
set1 | set2 # 和集合
[21]:
{1, 2, 3, 4, 5, 6}
[22]:
set1 & set2 # 積集合
[22]:
{3, 4}
[23]:
set1 - set2 # 差集合
[23]:
{1, 2}
[24]:
set1 ^ set2 # 対称差
[24]:
{1, 2, 5, 6}

比較演算

数値などを比較するのに用いた比較演算子を用いて、2つのセットを比較することもできます。

[25]:
print({1, 2, 3} == {1, 2, 3})
print({1, 2} == {1, 2, 3})
True
False
[26]:
print({1, 2, 3} != {1, 2, 3})
print({1, 2} != {1, 2, 3})
False
True

<=< は、集合の間の包含関係を判定します。

[27]:
print({1, 2, 3} <= {1, 2, 3})
print({1, 2, 3} < {1, 2, 3})
print({1, 2} < {1, 2, 3})
True
False
True
[28]:
print({1, 2} <= {2, 3, 4})
False

セットのメソッド

セットにも様々なメソッドが存在します。なお、以下のメソッドは全て破壊的です。

add

指定した要素を新たにセットに追加します。

[29]:
set1 = {1, 2, 3}
set1.add(4)
set1
[29]:
{1, 2, 3, 4}

remove

指定した要素をセットから削除します。 その要素がセットに含まれていない場合、エラーになります。

[30]:
set1.remove(1)
set1
[30]:
{2, 3, 4}
[31]:
set1.remove(10)
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
/tmp/ipykernel_7949/760318040.py in <module>
----> 1 set1.remove(10)

KeyError: 10

discard

指定した要素をセットから削除します。 その要素がセットに含まれていなくともエラーになりません。

[32]:
set1 = {1, 2, 3, 4}
set1.discard(1)
set1
[32]:
{2, 3, 4}
[33]:
set1.discard(5)

clear

全ての要素を削除して対象のセットを空にします。

[34]:
set1 = {1, 2, 3, 4}
set1.clear()
set1
[34]:
set()

pop

セットからランダムに1つの要素を取り出します。

[35]:
set1 = {1, 2, 3, 4}
print(set1.pop())
print(set1)
1
{2, 3, 4}

union, intersection, difference

和集合積集合差集合対称差を求めるメソッドも存在します。

[36]:
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}
set1.union(set2) # 和集合
[36]:
{1, 2, 3, 4, 5, 6}
[37]:
set1.intersection(set2) # 積集合
[37]:
{3, 4}
[38]:
set1.difference(set2) # 差集合
[38]:
{1, 2}
[39]:
set1.symmetric_difference(set2) # 対称差
[39]:
{1, 2, 5, 6}

練習

英語の文章からなる文字列 str_engsentences が引数として与えられたとき、str_engsentences 中に含まれる単語の種類数を返す関数 count_words2 を作成してください。

以下のセルの ... のところを書き換えて count_words2(str_engsentences) を作成してください。

[40]:
def count_words2(str_engsentences):
    ...

上のセルで解答を作成した後、以下のセルを実行し、実行結果が True になることを確認してください。

[41]:
print(count_words2('From Stettin in the Baltic to Trieste in the Adriatic an iron curtain has descended across the Continent.') == 15)
False

練習の解答

[42]:
def check_characters(str1):
    set1 = set(str1)
    return len(set1)
#check_characters('Onde a terra acaba e o mar começa')
[43]:
def check_dicsize(dic1):
    return len(set(dic1))
#check_dicsize({'apple': 0, 'orange': 2, 'pen': 1})

実は len は辞書に対してキーの数を返すので、セットを使う必要はありません。

[44]:
def check_dicsize(dic1):
    return len(dic1)
[45]:
def count_words2(str_engsentences):
    str1 = str_engsentences.replace('.', '') # 句読点を削除する
    str1 = str1.replace(',', '')
    str1 = str1.replace(':', '')
    str1 = str1.replace(';', '')
    str1 = str1.replace('!', '')
    str1 = str1.replace('?', '')
    list1 = str1.split(' ') # 句読点を削除した文字列を、単語ごとにリストに格納する
    set1 = set(list1) # リストを集合に変換して同じ要素を1つにまとめる
    return len(set1)
#count_words2('From Stettin in the Baltic to Trieste in the Adriatic an iron curtain has descended across the Continent.')
[ ]: