通常來說Python中任何值都是一個對象,因此任何類型(int、str、list…)都是一個類。而類就必然有它的方法或屬性,我們要記下這麼多類的所有方法顯然是不可能的,對此本文介紹兩個小技巧:
dir() :內建函數,用來查詢一個類或者對象所有屬性,比如>>> dir(list)。
help() :內建函數,用來查詢具體的說明文檔,比如>>> help(int)。
在上一篇的Python3的基礎資料型別 (Elementary Data Type)中,我們初步瞭解了list列表,也介紹了列表是Python 中使用最頻繁的資料類型。本文將進一步深入學習列表的使用。
一、列表的方法:
list.append(x)
在列表的尾部添加一個項,等價於 a[len(a):] = [x]。
list.extend(L)
將給定的列表L接到當前列表後面,等價於 a[len(a):] = L。
list.insert(i, x)
在給定的位置 i 前插入項,例如:a.insert(0, x) 會在列表的頭部插入,而 a.insert(len(a), x) 則等價於 a.append(x)。
list.remove(x)
移除列表中第一個值為 x 的項,沒有的話會產生一個錯誤。
list.pop([i])
刪除列表給定位置的項,並返回它。如果沒指定索引,a.pop()移除並返回列表最後一項。(方括弧表示可選)
list.clear()
刪除列表中的所有項,相當於 del a[:]。
list.index(x)
返回列表中第一個值為 x 的項的索引。如果沒有匹配的項, 則產生一個錯誤。
list.count(x)
返回列表中 x 出現的次數。
list.sort()
就地自動完成清單排序。
list.reverse()
就地自動完成清單項的翻轉。
list.copy()
返回列表的一個淺拷貝,相當於a[:]。
二、列表當棧
List的方法使得其可以很方便地作為一個棧來使用。我們知道,棧的特點是最後進入的元素最先出來(即後入先出),用append()方法進行壓棧,用不指定索引的pop()方法進行出棧。
範例程式碼如下:
stack = []for x in range(1,6): stack.append(x) # 入棧 print('push', x, end=' ') print(stack)print('Now stack is', stack)while len(stack)>0: print('pop', stack.pop(), end=' ') # 出棧 print(stack)
三、列表當隊列
列表還可以當作隊列來使用,隊列的特性是第一個加入的元素第一個取出來(即先入先出)。然而,把列表當隊列使用效率並不高,因為從列表的尾部添加和彈出元素是很快的,而在列表的開頭插入或彈出是比較慢的(因為所有元素都得移動一個位置)。
要實現一個隊列, 使用標準庫的collections.deque, 它被設計成在兩端添加和彈出都很快。
範例程式碼如下:
from collections import dequequeue = deque() # 建立空隊列for x in range(1,6): queue.append(x) # 入隊 print('push', x, end=' ') print(list(queue))print('Now queue is', list(queue))while len(queue)>0: print('pop', queue.popleft(), end=' ') # 出隊 print(list(queue))
四、列表推導式
列表推導式提供了從序列建立列表的簡單途徑。通常程式會對序列的每一個元素做些操作,並以其結果作為新列表的元素,或者根據指定的條件來建立子序列。
列表推導式的結構是:在一個方括弧裡,首先是一個運算式,隨後是一個 for 子句,然後是零個或更多的 for 或 if 子句。返回結果是一個根據表達從其後的 for 和 if 上下文環境中產生出來的列表。
範例程式碼如下:
squares = [x**2 for x in range(10)] # 推導式print(squares)# 輸出是[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]pairs = [(x, y) for x in [1,2,3] for y in [3,1,4] if x!=y] # 推導式print(pairs)# 輸出是[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
五、列表嵌套
Python中並沒有二維數組的概念,但我們可以通過列表嵌套達到同樣的目的。
mat = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]
同樣,我們可以使用推導式產生嵌套的列表:
mat = [[1,2,3], [4,5,6], [7,8,9]]new_mat = [ [row[i] for row in mat] for i in [0,1,2] ] # 嵌套print(new_mat)# 輸出[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
附:del語句
del語句可以通過給定索引(而不是值)來刪除列表中的項,它與返回一個值的pop()方法不同。del語句也可以移除列表中的切片,或者清除整個列表 :
lst = [1,2,3,4,5,6,7,8,9]del lst[2] # 刪除指定索引項目print(lst) del lst[2:5] # 刪除切片print(lst)del lst[:] # 刪除整個列表print(lst)del也可以用於刪除變數實體:del lst
在刪除變數實體之後引用 lst 的話會產生錯誤。