# 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)