# 集合 (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/
:::