■ はじめに
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