每天一小时python官方文档学习(四)————数据结构之列表
終于進入到第五章數據結構部分了,python中常用的容器有列表、元組、集合和字典,今天主要了解的是最為常用的列表。
5. 數據結構
5.1. 列表的更多特性
對于列表的操作有很多,具體操作看官方文檔就行,但是我們對列表有什么操作,是應該有個印象的,否則需要用到的時候不知道有這種操作,自然也談不上查文檔了。
- 通過list()或者中括號[]來新建一個列表;通過clear()刪除列表中所有的元素
- 在列表的末尾添加一個元素xappend(x);在列表中間插入一個元素insert(i, x)
- 刪除并返回列表中的最后一個元素pop();移除列表中第一個值為 x 的元素remove(x)
- 返回列表中第一個值為 x 的元素的從零開始的索引,也就是查找xindex(x);若要對x計數,返回元素 x 在列表中出現的次數,則用count(x);
- 對列表中的元素進行排序用sort();反轉列表中的元素則用reverse()。
一些方法示例如下:
>>> fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana'] >>> fruits.count('apple') 2 >>> fruits.count('tangerine') 0 >>> fruits.index('banana') 3 >>> fruits.index('banana', 4) # 從位置4開始查找banana 6 >>> fruits.reverse() >>> fruits ['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange'] >>> fruits.append('grape') >>> fruits ['banana', 'apple', 'kiwi', 'banana', 'pear', 'apple', 'orange', 'grape'] >>> fruits.sort() >>> fruits ['apple', 'apple', 'banana', 'banana', 'grape', 'kiwi', 'orange', 'pear'] >>> fruits.pop() 'pear'要注意到兩點:
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進隊列 >>> queue.append("Graham") # Graham進隊列 >>> queue.popleft() # 第一個元素Eric出列 'Eric' >>> queue.popleft() # 第一個元素John出列 'John' >>> queue # 現在的隊列 deque(['Michael', 'Terry', 'Graham'])5.1.3. 列表推導式
列表推導式是更簡單的創建列表的方法。常見的用法是把某種操作應用于序列或可迭代對象的每個元素上,然后使用其結果來創建列表,或者通過滿足某些特定條件元素來創建子序列。
例如,假設我們想創建一個平方列表,用for遍歷的話,就像這樣:
>>> 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)]列表推導式的結構是:由一對方括號[]包含以下內容:一個表達式,后面跟一個 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)]這里是更多的例子:
>>> vec = [-4, -2, 0, 2, 4] >>> # 創建一個將原列表里面的值*2的新列表, >>> [x*2 for x in vec] [-8, -4, 0, 4, 8] >>> # 去掉原列表中的負數 >>> [x for x in vec if x >= 0] [0, 2, 4] >>> # 對原列表中的所有元素應用一個函數(此處為絕對值函數) >>> [abs(x) for x in vec] [4, 2, 0, 2, 4] >>> # 在每個元素上調用一個方法 >>> freshfruit = [' banana', ' loganberry ', 'passion fruit '] >>> [weapon.strip() for weapon in freshfruit] ['banana', 'loganberry', 'passion fruit'] >>> # 創建一個二元的元組如(數字, 數字的平方) >>> [(x, x**2) for x in range(6)] [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)] >>> # 元組必須帶括號,否則會引發錯誤 >>> [x, x**2 for x in range(6)]File "<stdin>", line 1, in <module>[x, x**2 for x in range(6)]^ SyntaxError: invalid syntax >>> # 用帶有兩個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]5.1.4. 嵌套的列表推導式
列表推導式中的初始表達式可以是任何表達式,包括另一個列表推導式。
考慮下面這個 3x4的矩陣,它由3個長度為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]]注意遍歷是先i后row。這里如果用zip()可能會更簡單點:
>>> list(zip(*matrix)) #星號是解包參數列表,上一講已經介紹 [(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]所謂zip(),就是用來組合列表的,例如:
>>> x = [1, 2, 3] >>> y = [4, 5, 6] >>> zipped = zip(x, y) >>> list(zipped) [(1, 4), (2, 5), (3, 6)]zip()是組合,星號*是拆分,兩者可以看作是互為逆操作:
>>> x2, y2 = zip(*zip(x, y)) # x2為元組(1,2,3),y2為元組(4,5,6) >>> x == list(x2) and y == list(y2) True5.2. del 語句
前面介紹過刪除列表中的元素有pop和remove,那能不能按照給定的索引而不是值來移除列表中的一個元素呢?可以,使用del語句。
它不同于會返回一個值的 pop() 方法。 del 語句也可以用來從列表中移除切片或者清空整個列表(我們之前用過的方式是將一個空列表賦值給指定的切片)。 例如:
del 甚至可以被用來刪除整個變量,刪除后再引用 a 時就會報錯:
>>> del a總結
以上是生活随笔為你收集整理的每天一小时python官方文档学习(四)————数据结构之列表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 减肥总是放屁怎么回事
- 下一篇: 每天一小时python官方文档学习(五)