Python的序列類型——List
List
列表 List,本質是一個鏈表,從鏈表的實現角度來講,鏈表的每一個結點都存放著值和指向下一個節點的指針。
因此鏈表在內存的存儲可以是不連續的,它是一種高效的數據結構。因此列表與字符串的區別是列表可以進行任意
的修改。並且,列表的元素是任意的數據類型。當然,它支持循環、切片等多種操作。如果我們對列表進行切片,
那結果仍是一個列表。
列表在對某個序列進行轉換的時候,內部是通過循環進行的,而數字不能作為循環的對象因此數字不能轉化
為列表;而當列表轉化為字符串的時候,字符串函數將整個列表作為字符串,這種做法讓字符串變得醜陋,如果想
變得美觀可以自己寫循環解決。
1. 將字符 ==》 為列表
string = "abcdefg" print(list(string))
2. 列表 ==》 字符串:使用for循環
li = [1,2,3,4,"I","love","you"] for i in li: string = string + str(i) print(string)
3. 列表 ==》 字符串:列表中只有字符串時可使用join函數
li = ["I","love","you"] print("".join(li))
4. 聊聊extend(iterable)函數,該函數能擴展原列表,參數iterable
li = [1,2,3,4,"I","love","you"] li.extend([6,"here"]) li.extend("abc") #請註意和append的區別 print(li) #輸出:[1, 2, 3, 4, ‘I‘, ‘love‘, ‘you‘, 6, ‘here‘, ‘a‘, ‘b‘, ‘c‘]
註:與append相比,extend相當與在內部進行循環,再使用append函數往列表追加元素
5. 把列表當作堆棧使用
用 append() 方法可以把一個元素添加到堆棧頂。用不指定索引的 pop() 方法可以把一個元素從堆棧頂釋放出來。
li = ["1","2","3","4","5"] li.append("6") print(li) #輸出:[‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘] del_li = li.pop() #不加參數的pop print(del_li) #獲取刪除的值:6 print(li) #顯示刪除結果:[‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘]
6. 把列表當作隊列使用
我們也可以把列表當做隊列使用,隊列作為特定的數據結構,最先進入的元素最先釋放(先進先出)。不過,
列表這樣用效率不高。相對來說從列表末尾添加和彈出很快;在頭部插入和彈出很慢(因為,為了一個元素,要移
動整個列表中的所有元素)。要實現隊列,使用 collections.deque,它為在首尾兩端快速插入和刪除而設計。例如:
from collections import deque #導入 collections模塊的deque函數 li = ["Lily","Lynn Lee","John"] queue = deque(li) #使用deque函數 queue.append("Alger") #往隊列插入數據 queue.popleft() #刪除頭部 print(queue) #打印結果:deque([‘Lynn Lee‘, ‘John‘, ‘Alger‘])
7. 列表推導式
列表推導式由包含一個表達式的括號組成,表達式後面跟隨一個 for 子句,之後可以有零或多個 for 或 if 子句。
結果是一個列表,由表達式依據其後面的 for 和 if 子句上下文計算而來的結果構成。它的表達式的一般形式為:
[ 表達式 for [ if 子 句 ] ] 。 下面將以簡單的例子說明列表推導式的作用。
7.1 生成列表中x的2次冪——
- 不使用列表推導式
li = list(map(lambda x: x**2, range(10))) print(li) #打印結果為:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
- 使用列表推導式
li = [x**2 for x in range(10)] print(li) #打印結果為:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
7.2 按兩個列表元素不同的條件生成坐標——
- 不使用列表推導式
li = [] for x in [1,2,3]: for y in [3,4,5]: if x != y: li.append((x, y)) print(li) #輸出:[(1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5)]
- 使用列表推導式
li = [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y] print(li) #輸出:[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
很顯然,列表推導式非常簡潔,增強程序的可讀性
7.3 列表推導式的規範——
列表推導式的一般形式為:[ 表達式 for [if子句] ],在這裏表達式如果不是簡單的一條語句應該使用括號括起來。
不用括號括起來:報錯(語法錯誤)
[x, x**2 for x in range(6)] #報錯
用括號括起來:正常執行
from math import pi li = [str(round(pi, i)) for i in range(1, 4)] print(li) #輸出:[‘3.1‘, ‘3.14‘, ‘3.142‘]
7.4 應用舉例:交換矩陣的行列——
mylist = [ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], ] #第一個推導式獲取原矩陣的三行數據,然後對於每一行一次打印 li = [ [row[i] for row in mylist] for i in range(4) ] print(li) #輸出[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
8. 其他常用函數總結如下:
Python的序列類型——List