【Python】 Python ~ 基本編 / 集合 Set ~

■ はじめに

https://dk521123.hatenablog.com/entry/2019/10/12/084943
https://dk521123.hatenablog.com/entry/2020/11/01/000000
https://dk521123.hatenablog.com/entry/2019/10/27/100014
https://dk521123.hatenablog.com/entry/2020/10/11/000000

の続き。
今回は、集合 Set について、メモする。

目次

【1】集合 ~ Set~
【2】基本操作
 1)追加
 2)削除
 3)クリア
【3】クローン
【4】判定処理
 1)文字列が含まれているかどうかの判定
 2)対象Setと他のSetの一致・不一致
 3)対象Setと他のSetの部分一致
 4)互いに全く一致しない
【5】集合演算
 1)和集合(マージ)
 2)積集合(共通部分、交わり)

【1】集合 ~ Set~

* 重複排除
* set( ... ) を使う

results = set(["a1","b2","a1","c3"])
# ⇒ {'a1', 'b2', 'c3'}

【2】基本操作

# 定義
sample_set = set()

# 追加(add)
sample_set.add('Hello')
sample_set.add('World')
sample_set.add('!!!')
# {'!!!', 'Hello', 'World'}
print(sample_set)

# 削除(remove)
sample_set.remove('World')
# {'!!!', 'Hello'}
print(sample_set)

# 中に含まれているか
if 'Hello' in sample_set:
  print('sample_set has Hello')

# クリア(clear)
sample_set.clear()
# set()
print(sample_set)

1)追加

# add() で実行
sample_set.add('Hello')

2)削除

# remove() で実行
sample_set.remove('World')

3)クリア

# clear() で実行
sample_set.clear()

【3】クローン

「import copy」して使う。浅いコピーなら「set」で可能。
詳細は、以下の関連記事を参照のこと。

https://docs.python.org/ja/3/library/copy.html
サンプル

import copy

# 浅いコピー1
sample_set = set(['Hello', 'World', '!!!'])
cloned_set = copy.copy(sample_set)
sample_set.add('Mike')
# {'World', 'Mike', '!!!', 'Hello'}
print(sample_set)
# {'World', '!!!', 'Hello'}
print(cloned_set)

# 浅いコピー2
sample_set = set(['Hello', 'World', '!!!'])
cloned_set = set(sample_set)
sample_set.add('Mike')
# {'World', 'Mike', '!!!', 'Hello'}
print(sample_set)
# {'World', '!!!', 'Hello'}
print(cloned_set)

# 深いコピー
sample_set = set(['Hello', 'World', '!!!'])
cloned_set = copy.deepcopy(sample_set)
sample_set.add('Mike')
# {'World', 'Mike', '!!!', 'Hello'}
print(sample_set)
# {'World', '!!!', 'Hello'}
print(cloned_set)

参考文献
http://pythoncode.blog.fc2.com/blog-entry-109.html

【4】判定処理

* 2)以降は、以下のサイトがいい感じ。

https://www.javadrive.jp/python/set/index5.html

1)文字列が含まれているかどうかの判定

* in で判定

demo_set = {"Hello", "World", "!!"}
# in で判定
if 'Hello' in demo_set:

2)対象Setと他のSetの一致・不一致

* == / != で判定

demo_set = {"Hello", "World", "!!"}
demo1_set = {"World", "!!", "Hello"}
demo2_set = {"World", "Hello"}

# == / != で判定
print(demo_set  == demo1_set) # True
print(demo_set  != demo1_set) # False
print(demo_set  == demo2_set ) # False
print(demo_set  != demo2_set ) # True

3)対象Setと他のSetの部分一致

* 不等号(<=、<、>=、>)で判定

demo_set = {"Hello", "World", "!!"}
demo1_set = {"World", "!!", "Hello"}
demo2_set = {"World", "Hello"}
demo3_set = {"World", "!!", "Hello", "!???"}

# 集合が他の集合の部分集合かどうか(<=)
print(demo_set  <= demo1_set) # True
print(demo_set  <= demo2_set) # False
print(demo_set  <= demo3_set) # True (demo3_setがdemo_setを包括している)

4)互いに全く一致しない

* isdisjoint() で判定
 => 数学的には、「互いに素かどうか」(素=分離している)と表現するらしい

demo_set = {"Hello", "World", "!!"}
demo1_set = {"World", "!!", "Hello"}
demo2_set = {"World", "Hello"}
demo3_set = {"World", "!!", "Hello", "!???"}
demo4_set = {"Hi", "Good morning!"}

# isdisjoint
print(demo_set.isdisjoint(demo1_set)) # False
print(demo_set.isdisjoint(demo2_set)) # False
print(demo_set.isdisjoint(demo3_set)) # False
print(demo_set.isdisjoint(demo4_set)) # True
print("**************")
# not isdisjoint
print(not demo_set.isdisjoint(demo1_set)) # True
print(not demo_set.isdisjoint(demo2_set)) # True
print(not demo_set.isdisjoint(demo3_set)) # True
print(not demo_set.isdisjoint(demo4_set)) # False

【5】集合演算

https://www.javadrive.jp/python/set/index6.html

1)和集合(マージ)

fruits_1 = {"apple", "grape", "banana"}
fruits_2 = {"melon", "grape", "water melon", "banana"}

print(fruits_1.union(fruits_2))
# {'banana', 'grape', 'melon', 'apple', 'water melon'}

2)積集合(共通部分、交わり)

fruits_1 = {"apple", "grape", "banana"}
fruits_2 = {"melon", "grape", "water melon", "banana"}

results = fruits_1.intersection(fruits_2)
print(results) # {'banana', 'grape'}

[補足] リストでは intersection はできない

fruits_1 = ["apple", "grape", "banana"]
fruits_2 = ["melon", "grape", "water melon", "banana"]

results = fruits_1.intersection(fruits_2)       

# だと、エラーになる。
# AttributeError: 'list' object has no attribute 'intersection'

参考文献

https://uxmilk.jp/14834
https://python.atelierkobato.com/set/
https://www.javadrive.jp/python/set/index6.html

関連記事

Python ~ 基本編 / 文字列 ~
https://dk521123.hatenablog.com/entry/2019/10/12/075251
Python ~ 基本編 / リスト ~
https://dk521123.hatenablog.com/entry/2019/10/12/084943
Python ~ 基本編 / リスト・あれこれ ~
https://dk521123.hatenablog.com/entry/2020/11/01/000000