斤斤計較之Python:清單
- 1、基本操作
- 2、把清單當作堆棧使用
- 3、把清單當作隊列使用
- 4、清單推導式
1、基本操作
清單可以是 a = 'abcde'、b = ['a','b','c','d','e'] (注意字元串索引不允許被指派,但清單索引可以被修改)
+‐‐‐+‐‐‐+‐‐‐
| a | b | c | d | e |
+‐‐‐+‐‐‐+‐‐‐
0 1 2 3 4
‐4 ‐3 ‐2 ‐1
a[0] == b[0]=='a'
a[-1]==b[-1]=='e'
a[0:2]==a[:2]=='ab'
b[0:2]==b[:2]==['a','b']
b[::-1] = ['e', 'd', 'c', 'b', 'a']
a[::-1] == 'edcba'
a[-2:] == 'de'
2、把清單當作堆棧使用
我們都知道清單有兩個操作,一個是append(),一個是pop()。我們可以把append函數看為一個入棧的操作,将pop()為一個出站的操作。而且滿足的是先進後出的思維,正好與棧相仿。
harry= [1, 2, 3]
>>> harry.append(4)
>>> harry.append(5)
>>> harry
[1,2,3,4,5]
>>> harry.pop()
5
>>> harry
[1,2,3,4]
>>> harry.pop()
4
>>> harry.pop()
3
>>> harry
[1,2]
3、把清單當作隊列使用
我們知道清單中有一個insert()函數,當使用list1.insert(0,x),時會在list1的首位插入元素x,而使用pop()可以從清單的最後一位删去元素。是以能夠模拟進隊出隊操作。但是insert()的效率非常低為O(n),是以不推薦使用這種方法建構隊列。
而使用庫from collections import deque能夠實作效率為O(1)的隊列。
from collections import deque
>>> queue= deque([1,2,3])
>>> queue.append(4)
>>> queue.append(5)
>>>queue
deque([1,2,3,4,5])
>>> queue.popleft()
1
>>> queue.popleft() # The second to arrive now leaves
2
>>> queue
deque([3,4,5])
也就是說,append()相當于入隊操作,popleft()相當于出隊操作
4、清單推導式
當我們項建立一個清單式如:
cubes= []
for i in range(5):
x = i**3
cubes.append(x)
cubes= [0,1,8,27,64]
可以進行建立,但是建立完畢之後使用的變量x的值是存在的,也就是說産生了垃圾記憶體。
我們還可以使用清單推導式的方法就不會出現這種麻煩:
cubes= list(map(lambda x: x**3, range(5))) # 求0-4五個數的立方複制給cubes
或
cubes= [x**2 for x in range(5)] # 求0-4五個數的立方複制給cubes
當然還可使用if:cubes= [x**2 for x in range(5) if x%2] # 求奇數的立方
清單推導式還可以進行嵌套操作,當我們将一個矩陣進行轉置是就可以使用清單嵌套操作:
matrix =[[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12]] # 建立一個3 * 4的矩陣
[[row[i] for row in matrix] for i in range(4)] # 将矩陣轉換成4 * 3的矩陣形式
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
當然使用list(zip(*matrix))進行轉置會更加友善
上述的操作與兩層for循環嵌套在時間複雜度上并沒有什麼提升,他隻是将算法變得簡潔易懂了。
本人的另一篇博文詳細記錄了python清單的操作函數表格:傳送門