# Python基礎資料結構(4)
### ***就跟資料夾不要亂擺一樣的道理,好的資料處理能讓你更好找到你想要的資訊***
### ***by 幻宇***
隨著資料量的增加,單純依賴變數來儲存資料已經無法滿足程式設計的需求。為了更有效地組織和操作這些龐大的資訊,Python引入了不同的資料儲存方式,這類儲存方式就被稱為 **「資料結構」**,在這一篇我們將會介紹以下三個基礎的資料結構
- 串列(list)
- 元組(tuples)
- 集合(sets)
字串(string)也屬於資料結構,但相關的語法在上一篇已有說明,所以這一篇就不再多做說明了
## 串列(list)
串列(又稱為「清單」或「列表」),與其他程式語言中的「陣列(array)」類似,每一個串列皆擁有一個名稱作為識別標誌,串列中的資料稱為「元素」,每個元素相當於一個變數,要存取特定元素時以位置(索引)存取
### 建立串列
將元素置於`[]`中,以`,`隔開,另外,串列建立時可以為空
```
串列名稱 = [ 元素1, 元素2, ...... ]
```
各個元素資料型態可以相同,也可以不同
### 迴圈自動建立串列
```python
a = [ x for x in range(10) ]
print(a)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
a = [x for x in range(1, 11) if x % 2 == 0]
print(a)
# [2, 4, 6, 8, 10]
```
### 轉為串列
轉為串列時,只能從字串來轉換
```python
a = "123"
a = list(a)
print(a)
# ['1', '2', '3']
```
### 存取元素
前面提到,要存取特定元素時以位置(索引)存取,要注意的是,第一個資料的索引值是 0 而不是 1 ,另外也可以加`-`表示存取倒數第幾個
```python
a = [1, 2, 3]
print(a[0])
# 1
print(a[-1])
# 3
```
### 遍歷存取元素
我們可以使用迴圈來存取串列中的所有元素
```python
a = [0, 1, 2, 3]
for i in a:
print( i, end = "")
# 0123
```
### 重設元素
與變數一樣,可以直接重設
```python
a = [1, 2, 3]
a[0] = 0
print(a[0])
# 0
```
### 切片
串列也可以和字串一樣使用切片功能,這裡就不多作解釋了
```python
a = [0, 1, 2, 3, 4, 5]
print(a[1:3])
# [1, 2]
```
### 運算子
Python的運算子同樣適用資料結構,這點在之後將不會多做說明
### 相關內建函數
- `len(list)`:取得串列長度
```python
a = [0, 1, 2, 3]
print(len(a))
# 4
```
- `max(list)`:找出最大的元素
```python
a = [0, 1, 2, 3]
print(max(a))
# 3
b = ["a", "b", "c"]
print(max(b))
# c
```
- `min(list)`:找出最小的元素
```python
a = [0, 1, 2, 3]
print(min(a))
# 0
b = ["a", "b", "c"]
print(min(b))
# a
```
- `append(x)`:將新的元素增加到串列尾端
```python
a = [1, 2, 3]
a.append(4)
print(a)
# [1, 2, 3, 4]
```
- `insert(i, x)`:在指定位置插入元素
```python
a = [1, 2, 3]
a.insert(0, 0)
print(a)
# [0, 1, 2, 3]
```
- `extend(list)`:將另一個串列接串列的尾端
```python
a = [0, 1]
b = [2, 3]
a.extend(b)
print(a)
# [0, 1, 2, 3]
```
- `remove(x)`:刪除串列中第一個等於`x`的元素
```python
a = [0, 1, 2, 3]
a.remove(0)
print(a)
# [1, 2, 3]
```
- `pop()`:移除指定索引的元素,並回傳該元素,若不指定索引,則移除並回傳最後一個元素
```python
a = [0, 1, 2, 3]
print(a.pop(0))
# 0
print(a.pop())
# 3
print(a)
# [1, 2]
```
- `clear()`:清空串列
```python
a = [0, 1, 2, 3]
a.clear()
print(a)
# []
```
- `index(x, start, end )`:回傳串列中第一個等於`x`的元素索引值,若沒有找到則回傳`ValueError`錯誤,`start`和`end`是用來限定搜尋範圍的,可以不設
```python
a = [0, 1, 2, 3]
print(a.index(1))
# 1
```
- `count(x)`:計算`x`出現的次數
```python
a = [0, 1, 2, 3, 3, 3]
print(a.count(3))
# 3
```
- `sort()`:對串列進行升序排列,若指定`reverse=True`則為降序排列
```python
a = [1, 6, 2, 4, 3, 5]
a.sort(reverse=True)
print(a)
# [6, 5, 4, 3, 2, 1]
```
- `list(map(int, input().split()))`:同一行,讀取多個數值,並轉為整數,數值以空格分開
```python
num = list(map(int, input().split()))
```
## 元組(tuples)
元組的大部分功能和串列一樣,差別在於元組在宣告後就無法再進行修改,通常用於不需要修改內容的資料,由於元組的存取速度比串列快,因此也更有效率
### 建立元組
將元素置於`()`中,以`,`隔開
```
元組名稱 = ( 元素1, 元素2, ...... )
```
各個元素資料型態可以相同,也可以不同
## 集合(sets)
集合是無序且不重複的元素集合,用於需要去重複的資料,若在宣告時存在重複的元素,則只會留下一個元素,集合內元素必須為可哈希(hashable)的(如整數、字符串等不可變類型),另外,因為集合中的元素沒有特定順序,所以無法透過索引訪問
### 建立集合
將元素置於`{}`中,以`,`隔開
```
集合名稱 = { 元素1, 元素2, ...... }
```
各個元素資料型態可以相同,也可以不同
### 建立空集合
建立空集合需使用`set()`函數,若直接使用`{}`會變成建立字典
```
集合名稱 = set()
```
### 轉為集合
```python
a = [1, 1, 2, 2, 3, 3, 4, 4]
print(set(a))
# {1, 2, 3, 4}
```
### 內建函數
- `len()`:取得集合長度
```python
a = {1, 2, 3, 4}
print(len(a))
# 4
```
- `add()`:添加一個元素
```python
a = {1, 2, 3, 4}
a.add(5)
print(a)
# {1, 2, 3, 4, 5}
```
- `remove()`:刪除指定元素,若元素不存在則回傳`KeyError`錯誤
```python
a = {1, 2, 3, 4}
a.remove(4)
print(a)
# {1, 2, 3}
```
- `discard()`:刪除指定元素,若元素不存在不會回傳異常
```python
a = {1, 2, 3, 4}
a.discard(4)
print(a)
# {1, 2, 3}
```
- `pop()`:刪除排序後第一個元素並回傳,若集合為空則回傳`KeyError`錯誤
```python
a = {1, 2, 3, 4}
print(a.pop())
# 1
```
- `clear()`:清空集合
```python
a = {1, 2, 3, 4}
a.clear()
print(a)
# set()
```
- `union()`:求聯集
```python
a = {1, 2, 3}
b = {3, 4, 5}
print(a.union(b))
# {1, 2, 3, 4, 5}
print(a | b)
# {1, 2, 3, 4, 5}
```
- `intersection()`:求交集
```python
a = {1, 2, 3}
b = {3, 4, 5}
print(a.intersection(b))
# {3}
print(a & b)
# {3}
```
- `difference()`:求集合a中不存再集合b中的元素(差集)
```python
a = {1, 2, 3}
b = {3, 4, 5}
print(a.difference(b))
# {1, 2}
print(a - b)
# {1, 2}
```
- `symmetric_difference()`:求只存在於其中一個集合的元素
```python
a = {1, 2, 3}
b = {3, 4, 5}
print(a.symmetric_difference(b))
# {1, 2, 4, 5}
print(a ^ b)
# {1, 2, 4, 5}
```
- `issubset()`:判斷一個集合是否為另一個集合的子集
```python
a = {1, 2, 3, 4, 5}
b = {1, 2, 3}
print(b.issubset(a))
#判斷b集合是否為a集合的子集
# True
```
- `issuperset()`:判斷一個集合是否為另一個集合的超集
```python
a = {1, 2, 3, 4, 5}
b = {1, 2, 3}
print(b.issuperset(a))
#判斷b集合是否為a集合的超集
# False
```
- `isdisjoint()`:判斷兩個集合是否沒有相交
```python
a = {1, 2, 3}
b = {4, 5, 6}
print(b.isdisjoint(a))
#判斷a集合和b集合是否沒有相交
# True
```
## 總結
在這一篇我們介紹了幾個基礎的資料結構而進階的資料結構,例如字典這類較為複雜的資料結構將會等到進階語法時在介紹
## [下一篇](https://hackmd.io/@Huanyu763/Python函數、模組與套件)
## [回到主頁](https://hackmd.io/@Huanyu763/home)