# 集合 (set) ###### tags: `Python` 集合 (set) を扱うためのデータ型もあります。 数学の集合と似たものだ。 * 同一の要素は重複できない。 * 要素の順序はない。 :::info python內可以使用名為集合(set)的資料型態。 * 同一個元素不能重複 * 元素之間沒有順序 ::: 集合內的元素一定是不可變的(immutable),但集合本身是可變的(mutable) 可變的(mutable)內容可以用set()變成集合 ## set型の基本的な使い方 :::info set型態的基本用法 ::: 中括弧の中にカンマ区切りで要素を列挙します。 ``` python= setint = {1, 2, 3, 4, 5} setstr = {'Python', 'Java', 'C'} #オブジェクトからsetを作成 set_a = set() #空のsetの作成 setob = set([1, 2, 3, 4, 5]) ``` :::danger 如果直接使用 {} 的話是建立空字典。 ::: ## 同一の要素は重複できない setでは同一の要素は重複できないので、同じ値が複数ある場合1つだけ格納されます。 :::info 同一個元素不能重複 由於在set型態內同一個元素不能重複,在同樣的值有複數的情況下,只會放入一個值。 ::: ```python= set_a = {1, 1, 2, 2.0, 3, 3.00} print(set_a) ``` **Results:** ``` {1, 2, 3} ``` ## 要素の順序はない setはインデックス番号で要素を管理しているのではないため、要素の順序はありません。 :::info 元素之間沒有順序 由於set型態沒有index索引值做元素之間的管理,所以元素之間沒有順序。 ::: ```python= set_a = {1, (1,2,3,4), 'abc', (4, 'はい', 8.0)} print(set_a) ``` **Results:** ``` {'abc', 1, (1, 2, 3, 4), (4, 'はい', 8.0)} ``` ## setのイテレーション setもlistなどと同様にイテレート処理が可能です。 ``` for 変数 in set型オブジェクト: 処理 ``` ```python= set_a = {1, (1,2,3,4), 'abc', (4, 'はい', 8.0)} for x in set_a: print(x) ``` **Results:** ``` (1, 2, 3, 4) 1 abc (4, 'はい', 8.0) ``` ## 要素を追加する addメソッドを使います。 :::info 增加元素 使用add方法 ::: ```python= setstr = {'Python', 'Java', 'C'} setstr.add('c#') print(setstr) ``` **Results:** ``` {'Java', 'c#', 'C', 'Python'} ``` ## 要素を削除する ### remove() remove()メソッドは、引数で削除する要素を指定します。 :::info 刪除元素 刪除指定的元素 ::: ```python= setstr = {'Python', 'Java', 'C'} setstr.remove('C') print(setstr) ``` **Results:** ``` {'Python', 'Java'} ``` もし、存在しない要素を指定した場合はキーエラーになります。 :::info 如果指定的元素不存在的話會發生錯誤 ::: ```python= setstr = {'Python', 'Java', 'C'} setstr.remove('C++') print(setstr) ``` **Results:** ``` KeyError: 'C++' ``` ### discard() discard()メソッドも、引数で削除したい要素を指定します。 remove()メソッドとの違いは、存在しない値を指定した場合です。discard()メソッドの場合はエラーにはならずに、そのまま無視されます。 :::info 刪除指定的元素。 跟remove()不一樣的地方在於,如果指定的元素不存在的話會忽略過去,不會產生錯誤。 ::: ```python= setstr = {'Python', 'Java', 'C'} setstr.discard("C") print(setstr) setstr.discard("C++") print(setstr) ``` **Results:** ``` {'Java', 'Python'} {'Java', 'Python'} ``` ## 要素をランダムに取り出して削除 pop()メソッドでもsetの要素を削除することができます。 ただし、リストや辞書のpop()メソッドと違って、setのpop()は削除する要素を引数で指定することはできません。 setからランダムに要素を取り出して削除します。 :::danger 因為建立set時是沒有順序的,雖然看似都取第一個,但結果來說是亂數的(因為我們沒辦法預測會取到哪一個質) ::: ```python= num_set = {80, 60, 4, 5, 77, 6, 8, 9, 10} print(num_set) popped = num_set.pop() print(num_set) print(popped) ``` **Results:** ``` {4, 5, 6, 8, 9, 10, 77, 80, 60} {5, 6, 8, 9, 10, 77, 80, 60} 4 ``` :::spoiler https://www.sejuku.net/blog/21923 https://www.headboost.jp/python-set/ https://www.python.ambitious-engineer.com/archives/70 https://www.python-izm.com/basic/set/ :::