Python風格總結:數據結構

列表

Python中列表是可變的,這是它區別於字符串和元組的最重要的特點,一句話概括即:列表可以修改,而字符串和元組不能。

以下是 Python 中列表的方法:

方法 描述
list.append(x) 把一個元素添加到列表的結尾,相當於 a[len(a):] = [x]。
list.extend(L) 通過添加指定列表的所有元素來擴充列表,相當於 a[len(a):] = L。
list.insert(i, x) 在指定位置插入一個元素。第一個參數是準備插入到其前面的那個元素的索引,例如 a.insert(0, x) 會插入到整個列表之前,而 a.insert(len(a), x) 相當於 a.append(x) 。
list.remove(x) 刪除列表中值爲 x 的第一個元素。如果沒有這樣的元素,就會返回一個錯誤。
list.pop([i]) 從列表的指定位置移除元素,並將其返回。如果沒有指定索引,a.pop()返回最後一個元素。元素隨即從列表中被移除。(方法中 i 兩邊的方括號表示這個參數是可選的,而不是要求你輸入一對方括號,你會經常在 Python 庫參考手冊中遇到這樣的標記。)
list.clear() 移除列表中的所有項,等於del a[:]。
list.index(x) 返回列表中第一個值爲 x 的元素的索引。如果沒有匹配的元素就會返回一個錯誤。
list.count(x) 返回 x 在列表中出現的次數。
list.sort() 對列表中的元素進行排序。
list.reverse() 倒排列表中的元素。
list.copy() 返回列表的淺複製,等於a[:]。

注意:類似 insert, remove 或 sort 等修改列表的方法沒有返回值。

將列表當做堆棧使用

列表方法使得列表可以很方便的作爲一個堆棧來使用,堆棧作爲特定的數據結構,最先進入的元素最後一個被釋放(後進先出)。用 append() 方法可以把一個元素添加到堆棧頂。用不指定索引的 pop() 方法可以把一個元素從堆棧頂釋放出來。例如:

>>> stack = [3, 4, 5]
>>> stack.append(6)
>>> stack.append(7)
>>> stack
[3, 4, 5, 6, 7]
>>> stack.pop()
7
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack.pop()
5
>>> stack
[3, 4]

將列表當作隊列使用

也可以把列表當做隊列用,只是在隊列裏第一加入的元素,第一個取出來;但是拿列表用作這樣的目的效率不高。在列表的最後添加或者彈出元素速度快,然而在列表裏插入或者從頭部彈出速度卻不快(因爲所有其他的元素都得一個一個地移動)。

 

列表推導式

列表推導式提供了從序列創建列表的簡單途徑。通常應用程序將一些操作應用於某個序列的每個元素,用其獲得的結果作爲生成新列表的元素,或者根據確定的判定條件創建子序列。

每個列表推導式都在 for 之後跟一個表達式,然後有零到多個 for 或 if 子句。返回結果是一個根據表達從其後的 for 和 if 上下文環境中生成出來的列表。如果希望表達式推導出一個元組,就必須使用括號。

這裏我們將列表中每個數值乘三,獲得一個新的列表:

>>> vec = [2, 4, 6]
>>> [3*x for x in vec]
[6, 12, 18]

現在我們玩一點小花樣:

>>> [[x, x**2] for x in vec]
[[2, 4], [4, 16], [6, 36]]

這裏我們對序列裏每一個元素逐個調用某方法:

>>> freshfruit = ['  banana', '  loganberry ', 'passion fruit  ']
>>> [weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']

我們可以用 if 子句作爲過濾器:

>>> [3*x for x in vec if x > 3]
[12, 18]
>>> [3*x for x in vec if x < 2]
[]

以下是一些關於循環和其它技巧的演示:

vec1 = [2,4,6]
vec2 = [4,3,-9]
print([x*y for x in vec1 for y in vec2])
print([x+y for x in vec1 for y in vec2])
print([vec1[i]*vec2[i] for i in range(len(vec1))])

結果輸出: 

[8, 6, -18, 16, 12, -36, 24, 18, -54]
[6, 5, -7, 8, 7, -5, 10, 9, -3]
[8, 12, -54]

列表推導式可以使用複雜表達式或嵌套函數:

>>> [str(round(355/113, i)) for i in range(1, 6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']

點評:比寫for循環確實簡單很多。但是不知道效率如何?

嵌套列表解析

Python的列表還可以嵌套。

以下實例展示了3X4的矩陣列表:

matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
]

以下實例將3X4的矩陣列表轉換爲4X3列表:

matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
]
t = [[row[i] for row in matrix] for i in range(4)]
print(t)

結果輸出

[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

以下實例也可以使用以下方法來實現:

matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
]
transposed = []
for i in range(4):
    transposed.append([row[i] for row in matrix])
print(transposed)

結果輸出: 

[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

另外一種實現方法:

matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
]
transposed = []
for i in range(4):
    # the following 3 lines implement the nested listcomp
    transposed_row = []
    for row in matrix:
        transposed_row.append(row[i])
    transposed.append(transposed_row)
print(transposed)

這種方法符合正常思維。(但是麻煩)

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章