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.index(_x_)`
返回鏈表中第一個值為?_x_?的元素的索引。如果沒有匹配的元素就會返回一個錯誤。
`list.count(_x_)`
返回?_x_?在鏈表中出現的次數。
`list.sort()`
對鏈表中的元素就地進行排序。
`list.reverse()`
就地倒排鏈表中的元素。
下面這個示例演示了鏈表的大部分方法:
~~~
>>> a = [66.25, 333, 333, 1, 1234.5]
>>> print(a.count(333), a.count(66.25), a.count('x'))
2 1 0
>>> a.insert(2, -1)
>>> a.append(333)
>>> a
[66.25, 333, -1, 333, 1, 1234.5, 333]
>>> a.index(333)
1
>>> a.remove(333)
>>> a
[66.25, -1, 333, 1, 1234.5, 333]
>>> a.reverse()
>>> a
[333, 1234.5, 1, 333, -1, 66.25]
>>> a.sort()
>>> a
[-1, 1, 66.25, 333, 333, 1234.5]
~~~
也許大家會發現像?insert,?remove?或者?sort?這些修改列表的方法沒有打印返回值–它們返回None。在 python 中對所有可變的數據類型這是統一的設計原則。
### 5.1.1\. 把鏈表當作堆棧使用
鏈表方法使得鏈表可以很方便的做為一個堆棧來使用,堆棧作為特定的數據結構,最先進入的元素最后一個被釋放(后進先出)。用?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]
~~~
### 5.1.2\. 把鏈表當作隊列使用
你也可以把鏈表當做隊列使用,隊列作為特定的數據結構,最先進入的元素最先釋放(先進先出)。不過,列表這樣用效率不高。相對來說從列表末尾添加和彈出很快;在頭部插入和彈出很慢(因為,為了一個元素,要移動整個列表中的所有元素)。
要實現隊列,使用?collections.deque,它為在首尾兩端快速插入和刪除而設計。例如:
~~~
>>> from collections import deque
>>> queue = deque(["Eric", "John", "Michael"])
>>> queue.append("Terry") # Terry arrives
>>> queue.append("Graham") # Graham arrives
>>> queue.popleft() # The first to arrive now leaves
'Eric'
>>> queue.popleft() # The second to arrive now leaves
'John'
>>> queue # Remaining queue in order of arrival
deque(['Michael', 'Terry', 'Graham'])
~~~
### 5.1.3\. 列表推導式
列表推導式為從序列中創建列表提供了一個簡單的方法。普通的應用程式通過將一些操作應用于序列的每個成員并通過返回的元素創建列表,或者通過滿足特定條件的元素創建子序列。
例如, 假設我們創建一個 squares 列表, 可以像下面方式:
~~~
>>> squares = []
>>> for x in range(10):
... squares.append(x**2)
...
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
~~~
我們同樣能夠達到目的采用下面的方式:
~~~
squares = [x**2 for x in range(10)]
~~~
這也相當于?squares?=?map(lambda?x:?x**2,?range(10)),但是上面的方式顯得簡潔以及具有可讀性。
列表推導式由包含一個表達式的括號組成,表達式后面跟隨一個?for?子句,之后可以有零或多個for?或?if?子句。結果是一個列表,由表達式依據其后面的?for?和?if?子句上下文計算而來的結果構成。
例如,如下的列表推導式結合兩個列表的元素,如果元素之間不相等的話:
~~~
>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
~~~
等同于:
~~~
>>> combs = []
>>> for x in [1,2,3]:
... for y in [3,1,4]:
... if x != y:
... combs.append((x, y))
...
>>> combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
~~~
值得注意的是在上面兩個方法中的?for?和?if?語句的順序。
如果想要得到一個元組,必須要加上括號:
~~~
>>> vec = [-4, -2, 0, 2, 4]
>>> # create a new list with the values doubled
>>> [x*2 for x in vec]
[-8, -4, 0, 4, 8]
>>> # filter the list to exclude negative numbers
>>> [x for x in vec if x >= 0]
[0, 2, 4]
>>> # apply a function to all the elements
>>> [abs(x) for x in vec]
[4, 2, 0, 2, 4]
>>> # call a method on each element
>>> freshfruit = [' banana', ' loganberry ', 'passion fruit ']
>>> [weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']
>>> # create a list of 2-tuples like (number, square)
>>> [(x, x**2) for x in range(6)]
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
>>> # the tuple must be parenthesized, otherwise an error is raised
>>> [x, x**2 for x in range(6)]
File "", line 1, in ?
[x, x**2 for x in range(6)]
^
SyntaxError: invalid syntax
>>> # flatten a list using a listcomp with two 'for'
>>> vec = [[1,2,3], [4,5,6], [7,8,9]]
>>> [num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
~~~
列表推導式可使用復雜的表達式和嵌套函數:
~~~
>>> from math import pi
>>> [str(round(pi, i)) for i in range(1, 6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']
~~~
### 5.1.4\. 嵌套的列表推導式
列表推導式可以嵌套。
考慮以下的 3x4 矩陣, 一個列表中包含三個長度為4的列表:
~~~
>>> matrix = [
... [1, 2, 3, 4],
... [5, 6, 7, 8],
... [9, 10, 11, 12],
... ]
~~~
現在,如果你想交換行和列,可以用嵌套的列表推導式:
~~~
>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
~~~
像前面看到的,嵌套的列表推導式是對?for?后面的內容進行求值,所以上例就等價于:
~~~
>>> transposed = []
>>> for i in range(4):
... transposed.append([row[i] for row in matrix])
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 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)
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
~~~
在實際中,你應該更喜歡使用內置函數組成復雜流程語句。對此種情況?zip()?函數將會做的更好:
~~~
>>> list(zip(*matrix))
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]
~~~
更多關于本行中使用的星號的說明,參考?[_參數列表的分拆_](http://www.pythondoc.com/pythontutorial3/controlflow.html#tut-unpacking-arguments)。
- Python 入門指南
- 1. 開胃菜
- 2. 使用 Python 解釋器
- 2.1. 調用 Python 解釋器
- 2.2. 解釋器及其環境
- 3. Python 簡介
- 3.1. 將 Python 當做計算器
- 3.2. 編程的第一步
- 4. 深入 Python 流程控制
- 4.1. if 語句
- 4.2. for 語句
- 4.3. range() 函數
- 4.4. break 和 continue 語句, 以及循環中的 else 子句
- 4.5. pass 語句
- 4.6. 定義函數
- 4.7. 深入 Python 函數定義
- 4.8. 插曲:編碼風格
- 5. 數據結構
- 5.1. 關于列表更多的內容
- 5.2. del 語句
- 5.3. 元組和序列
- 5.4. 集合
- 5.5. 字典
- 5.6. 循環技巧
- 5.7. 深入條件控制
- 5.8. 比較序列和其它類型
- 6. 模塊
- 6.1. 深入模塊
- 6.2. 標準模塊
- 6.3. dir() 函數
- 6.4. 包
- 7. 輸入和輸出
- 7.1. 格式化輸出
- 7.2. 文件讀寫
- 8. 錯誤和異常
- 8.1. 語法錯誤
- 8.2. 異常
- 8.3. 異常處理
- 8.4. 拋出異常
- 8.5. 用戶自定義異常
- 8.6. 定義清理行為
- 8.7. 預定義清理行為
- 9. 類
- 9.1. 術語相關
- 9.2. Python 作用域和命名空間
- 9.3. 初識類
- 9.4. 一些說明
- 9.5. 繼承
- 9.6. 私有變量
- 9.7. 補充
- 9.8. 異常也是類
- 9.9. 迭代器
- 9.10. 生成器
- 9.11. 生成器表達式
- 10. Python 標準庫概覽
- 10.1. 操作系統接口
- 10.2. 文件通配符
- 10.3. 命令行參數
- 10.4. 錯誤輸出重定向和程序終止
- 10.5. 字符串正則匹配
- 10.6. 數學
- 10.7. 互聯網訪問
- 10.8. 日期和時間
- 10.9. 數據壓縮
- 10.10. 性能度量
- 10.11. 質量控制
- 10.12. “瑞士軍刀”
- 11. 標準庫瀏覽 – Part II
- 11.1. 輸出格式
- 11.2. 模板
- 11.3. 使用二進制數據記錄布局
- 11.4. 多線程
- 11.5. 日志
- 11.6. 弱引用
- 11.7. 列表工具
- 11.8. 十進制浮點數算法
- 12. 接下來?
- 13. 交互式輸入行編輯歷史回溯
- 13.1. 行編輯
- 13.2. 歷史回溯
- 13.3. 快捷鍵綁定
- 13.4. 其它交互式解釋器
- 14. 浮點數算法:爭議和限制
- 14.1. 表達錯誤
- 15. 附錄
- 15.1. 交互模式