▲セット (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)
Cell In[15], line 1
----> 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)
Cell In[31], line 1
----> 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.')
[ ]: