Python - セット(set)

公開日:2019-03-08 更新日:2019-05-29
[Python]

1. 概要

セット(set)の使い方です。ここで言うセットは、「集合」と言う意味です。
セットは、順序と重複要素がない値の集合で、集合同士の演算が行えます。
セットは、リストの [ ] を { } にしたものになります。


2.1 セットオブジェクトの生成

セットは順序を持たない、ループで取り出すと、生成時の順番と異なる場合があります。
セットはリストと同じく、for で要素を1つずつ取得することができます。

s = { 3, 1, 2, "a", "b", "c" }

for item in s:
	print(item)
b
1
2
3
a
c

2.2 要素の追加、取得、削除

リストと同じように追加・削除が行えます。
但し、インデックスにより操作はできません。

s = {"a", "b", "c"}

#要素の追加
s.add("d")
print(s)

#要素の取得と削除
element = s.pop()
print(element + " を取り出しました。")
print(s)

#要素の削除
s.remove("c")

print(s)
{'b', 'd', 'c', 'a'}
b を取り出しました。
{'d', 'c', 'a'}
{'d', 'a'}

2.3 和集合

集合と集合を併せた集合を作成します。
作成するには、「|」演算子と union() メソッドを使う方法があります。
メソッドを使った場合は、直接リストを指定できます。

s1 = { 1, 2, 3, 4 }
s2 = {       3, 4, 5, 6 }

print( s1.union(s2) )
print( s1 | s2 )

print( s1.union( [3, 4, 5, 6] ) )

{1, 2, 3, 4, 5, 6}
{1, 2, 3, 4, 5, 6}
{1, 2, 3, 4, 5, 6}

2.4 積集合

集合と集合の重複箇所の集合を作成します。

s1 = { 1, 2, 3, 4 }
s2 = {       3, 4, 5, 6 }

print( s1.intersection(s2) )
print( s1 & s2 )

print( s1.intersection( [3, 4, 5, 6] ) )
{3, 4}
{3, 4}
{3, 4}

2.5 差集合

集合から集合を引いて集合を作成します。
引けない要素は無視されます。

s1 = { 1, 2, 3, 4 }
s2 = {       3, 4, 5, 6 }

print( s1.difference(s2) )
print( s1 - s2 )
print( s1.difference( [3, 4, 5, 6] ) )

print("-----")

print( s2.difference(s1) )
print( s2 - s1 )
print( s2.difference( [1, 2, 3, 4] ) )
{1, 2}
{1, 2}
{1, 2}
-----
{5, 6}
{5, 6}
{5, 6}

2.6 対称差集合

集合と集合の重複しない要素で集合を作成します。
集合と集合の排他的論理和(XOR)です。

s1 = { 1, 2, 3, 4 }
s2 = {       3, 4, 5, 6 }

print( s1.symmetric_difference(s2) )
print( s1 ^ s2 )
print( s1.symmetric_difference( [3, 4, 5, 6] ) )

print( s2.symmetric_difference(s1) )
print( s2 ^ s1 )
print( s2.symmetric_difference( [1, 2, 3, 4] ) )
{1, 2, 5, 6}
{1, 2, 5, 6}
{1, 2, 5, 6}
{1, 2, 5, 6}
{1, 2, 5, 6}
{1, 2, 5, 6}

2.7 部分集合の判定

集合に集合が含まれているかどうかを判定します。

s1 = { 1, 2, 3 }
s2 = { 1, 2, 3, 4, 5, 6 }

print(s1.issubset(s2))
print(s1 <  s2)
print(s1 <= s2)
print(s1 == s2)

print("-----")

print(s2.issuperset(s1))
print(s2 >  s1)
print(s2 >= s1)
print(s2 == s1)
True
True
True
False
-----
True
True
True
False

集合同士が全く同じ場合は、< と > を使った比較は False になります。
s1 = { 1, 2, 3, 4, 5, 6 }
s2 = { 1, 2, 3, 4, 5, 6 }

print(s1.issubset(s2))
print(s1 <  s2)          #False
print(s1 <= s2)
print(s1 == s2)

print("-----")

print(s2.issuperset(s2))
print(s2 >  s1)          #False
print(s2 >= s1)
print(s2 == s1)
True
False
True
True
-----
True
False
True
True

2.8 集合からリストへの変換

s = { 1, 2, 3, 4, 5 }
lst = list(s)

print(lst)
[1, 2, 3, 4, 5]

2.9 リストから集合への変換

lst = [1, 2, 3, 4, 5]
s = set(lst)

print(s)
{1, 2, 3, 4, 5}