當你需要紀錄1個朋友的電話號碼
-> 開1個變數
當你需要紀錄100個朋友的電話號碼
-> 開100個變數?
當你需要紀錄全台灣\(2 \times 10^{7}\)人的電話號碼
-> 開\(2 \times 10^{7}\)個變數???!!?!?
電話簿
像這樣把很多資料綁在一起
變成一個資料們的組合,統一管理
這樣的概念就是資料結構
而「結構」這個名稱
則是跟儲存這些資料的方法有關
例如:
把資料排成一排儲存 → 陣列
把資料用樹狀結構儲存 → 樹
Python內建資料結構 - 1
特點
備註
list中文翻譯:「鏈結串列」
不同於陣列的資料結構
但Python把類似陣列的資料結構叫做list
是很糟糕的翻譯
a = [1, 2, 3, 4] a = list(1, 2, 3, 4)
建立
a = [1, '2', True, [3, 4, 5]]
list裡面可以塞任何東西,甚至另外一個list
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
二維list
list裡面都是裝list
a = [2 for i in range(5)] # 2 2 2 2 2 a = [i for i in range(4)] # 0 1 2 3 a = [i*2 + 5 for i in range(3)] # 5 7 9
用for迴圈建立一個list
這個做法叫做Comprehension
把一個整數list輸入進來
(Ex. 輸入為4 2 4 3)
a = list(map(int, input().split(' ')))
a = [1, 2, 3, 4] print(a[0]) # 1 print(a[2]) # 3
跟C++一樣,用中括號
第一個東西的索引值一樣是0
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] print(a[0][1]) # 2 print(a[2][0]) # 7
二維list取值
a = [1, 2, 3, 4] print(a[-1]) # 4 print(a[-3]) # 2
Python索引值可以是負的!
(不常用用法)
a = [1, 2, 3, 4] x, y, z, w = a print(x, y, z, w) # 1 2 3 4 x, y, z = a # 錯誤
可以用變數接收list的每一項
注意,變數個數 = list長度
(更奇怪用法)
a = [1, 2, 3, 4] x, y, *z = a # 1, 2, [3, 4] x, *y, z = a # 1, [2, 3], 4 *x, y, z = a # [1, 2], 3, 4
請注意,*不是指標!
前面加*代表其他變數取完值
剩下的廚餘(?)都會給這個變數
Python超好用語法
slice
取得資料組裡面一段連續區間
a[開始:結束:間隔]
a = [0, 1, 2, 3, 4, 5] print(a[2:4]) # 2 3 print(a[:4]) # 0 1 2 3 print(a[2:]) # 2 3 4 5 print(a[:]) # 0 1 2 3 4 5 print(a[::-1]) # 5 4 3 2 1 0
a = [0, 0, 0, 0] a[2] = 1 print(a) # 0, 0, 1, 0
直接修改
a = [1, 2, 3, 4] a.append(5) # 1 2 3 4 5 a.extend([6, 7, 8]) # 1 2 3 4 5 6 7 8 a += [9, 10, 11] # 1 2 3 4 5 ... 9 10 11
新增
a = [1, 3, 4, 5] a.insert(1, 2) # 1 2 3 4 5
插入2到a[1]
後面的資料會被往後擠
a = [1, 2, 2.5, 3, 4, 5] a.pop() # 1 2 2.5 3 4 a.pop(2) # 1 2 3 4 a.remove(3) # 1 2 4
刪除
a = [1, 2, 3, 4] a.clear() print(a) # [] del a print(a) # Error
a = [1, 2, 3, 4] a.reverse() # 4, 3, 2, 1
原地反轉list
a = [1, 2, 3, 4] b = a[:] b = a.copy() b = [i for i in a] b = a # Not Suggested!
複製一個list
不要用b = a
!
詳細原因等等會介紹
a = [1, 2, 3, 4] print(len(a)) # 4
取得長度
a = [1, 2, 3, 4, 4, 4, 4] print(a.count(4)) # 4 print(a.index(4)) # 3
a = [1, 2, 3, 4, 5] if 3 in a: print("YES") else: print("NO") # YES
檢查資料有沒有出現
a = [1, 2, 3, 4, 5] for i in range(len(a)): print(a[i]) # 1 2 3 4 5
用索引值遍歷
a = [1, 2, 3, 4, 5] for i in a: print(i) # 1 2 3 4 5
a = ['a', 'b', 'c', 'd'] for item in enumerate(a): print(item) """ (0, 'a') (1, 'b') (2, 'c') (3, 'd') """
enumerate - 枚舉
把a裡面的物件列舉出來
用括號包著
左邊是索引值,右邊是物件
a = ['a', 'b', 'c', 'd'] for index, item in enumerate(a): print(index, item) """ 0 'a' 1 'b' 2 'c' 3 'd' """
也可以用兩個變數,一個存索引值,另一個存物件
a = ['a', 'b', 'c', 'd'] for index, item in enumerate(a, start=97): print(index, item) """ 97 a 98 b 99 c 100 d """
可以自己指定開始值,不一定是索引值
(補充:a的ascii碼是97, b是98, 依此類推)
還記得嗎?
a = b
\我大指標/
(可以動態調整大小其實跟C++的vector幾乎一樣)
Python內建資料結構 - 2
特點
備註
雖然tuple不能任意修改某個物件
但是tuple裡面有list的話仍可以修改那個list
(這跟tuple的原理有關)
備註
tuple因為不能修改
所以能做的操作比list會少很多
而且能做的操作跟list的幾乎一樣
a = 1, 2, 3, 4 a = (1, 2, 3, 4) a = tuple(1, 2, 3, 4)
建立
可以不需要括弧
但是有括弧比較好看
a = ((1, 2, 3), (4, 5, 6), (7, 8, 9))
二維tuple
tuple裡面都是裝tuple
a = tuple(2 for i in range(5)) # 2 2 2 2 2 a = tuple(i for i in range(4)) # 0 1 2 3 a = tuple(i*2 + 5 for i in range(3)) # 5 7 9
跟list一樣可以用for迴圈建立一個tuple
(還記得嗎?這個做法叫做Comprehension)
a = (2 for i in range(3)) print(type(a))
注意,不可以只有括號,要使用tuple()函式
否則a不會是一個tuple而是一個generator
(之後會教到什麼是generator :P)
a = (1, 2, 3, 4) print(a[0]) # 1 print(a[2]) # 3
跟list一樣,用中括號
第一個東西的索引值一樣是0
a = (1, 2, 3, 4) print(a[-1]) # 4 print(a[-3]) # 2
Python索引值可以是負的
(不常用用法)
a = (1, 2, 3, 4) x, y, z, w = a print(x, y, z, w) # 1 2 3 4 x, y, z = a # 錯誤
跟list一樣,可以用變數接收tuple的每一項
注意,變數個數 = tuple長度
(更奇怪用法)
a = (1, 2, 3, 4) x, y, *z = a # 1, 2, (3, 4) x, *y, z = a # 1, (2, 3), 4 *x, y, z = a # (1, 2), 3, 4
請注意,*不是指標!
前面加*代表其他變數取完值
剩下的廚餘(?)都會給這個變數
a = (0, 1, 2, 3, 4, 5) print(a[2:4]) # 2 3 print(a[:4]) # 0 1 2 3 print(a[2:]) # 2 3 4 5 print(a[:]) # 0 1 2 3 4 5 print(a[::-1]) # 5 4 3 2 1 0
跟list一樣可以用slice
tuple唯一能做的修改(至少我想到的)
只有刪除整個tuple
a = (1, 2, 3, 4) del a
a = (1, 2, 3, 4) print(len(a)) # 4
取得長度
a = (1, 2, 3, 4, 4, 4, 4) print(a.count(4)) # 4 print(a.index(4)) # 3
a = (1, 2, 3, 4, 5) if 3 in a: print("YES") else: print("NO") # YES
檢查資料有沒有出現
a = (1, 2, 3, 4, 5) for i in range(len(a)): print(a[i]) # 1 2 3 4 5
用索引值遍歷
a = (1, 2, 3, 4, 5) for i in a: print(i) # 1 2 3 4 5
a = ('a', 'b', 'c', 'd') for item in enumerate(a): print(item) """ (0, 'a') (1, 'b') (2, 'c') (3, 'd') """
enumerate - 枚舉
把a裡面的物件列舉出來
用括號包著
左邊是索引值,右邊是物件
a = ('a', 'b', 'c', 'd') for index, item in enumerate(a): print(index, item) """ 0 'a' 1 'b' 2 'c' 3 'd' """
也可以用兩個變數,一個存索引值,另一個存物件
a = ('a', 'b', 'c', 'd') for index, item in enumerate(a, start=97): print(index, item) """ 97 a 98 b 99 c 100 d """
可以自己指定開始值,不一定是索引值
(補充:a的ascii碼是97, b是98, 依此類推)
tuple的實作方式跟list幾乎一樣
只是他多了很多奇怪優化方式
速度:tuple > list
便利性:list > tuple
註:墊底master要拿100分需使用二分搜演算法
但前52分只要熟悉list就可以了!