天天看點

斤斤計較之Python:清單1、基本操作2、把清單當作堆棧使用3、把清單當作隊列使用4、清單推導式

斤斤計較之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清單的操作函數表格:傳送門