天天看點

Python 語言學習要點記錄5- list 相關

作者:逸劍聽潮

list

list 常用的内置函數:

list.append(x),将項目添加到清單的末尾。 等價于 a[len(a):] = [x]。

list.extend(可疊代),過附加 iterable 中的所有項目來擴充清單。 等價于 a[len(a):] = 可疊代。

list.insert(i, x),在給定位置插入一個項目。 第一個參數是要插入的元素的索引,是以 a.insert(0, x) 在清單的前面插入,而 a.insert(len(a), x) 等同于 a.append( x)。

list.remove(x),從清單中删除第一個值等于 x 的項。 如果找不到該項,它會引發 ValueError。

list.pop([i]),删除清單中給定位置的項目,并将其傳回。 如果未指定索引,a.pop() 将删除并傳回清單中的最後一項。

list.clear(),從清單中删除所有項目。 等價于del a[:]。

list.index(x[, start[, end]]),傳回清單中第一項的值等于 x 的從零開始的索引。 如果沒有這樣的項目,則引發 ValueError。可選參數 start 和 end 被解釋為切片符号,并用于将搜尋限制到清單的特定子序列。 傳回的索引是相對于完整序列的開頭而不是起始參數計算的。

list.count(x),傳回 x 在清單中出現的次數。

list.sort(*, key=None, reverse=False),對清單項進行排序。

list.reverse(),反轉清單的元素。

list.copy(),傳回清單的淺表副本。 等價于[:]。

fruits = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
fruits.count('apple')  #2
fruits.count('tangerine')  #0
fruits.index('banana')  #3
fruits.index('banana', 4)  #  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'           

僅修改清單的insert、remove或sort等方法沒有列印出傳回值,其實它們傳回的是預設值 None。 在 Python 中所有可變資料結構都遵循的設計原則。

如果 list 中的資料不是相同類型時,是沒辦法比較和排序的,例如 [5, 'abc', True],數字類型和字元串進行比較。而且有些資料類型沒有定義排序功能,例如複數,2 + 7j 和 3+5j 是不能進行比較的。

把 list 當作堆棧

清單提供的函數,可以很容易将清單用作堆棧,其中最後添加的元素,也是第一個可以彈出到的元素(“後進先出”)。可以使用 append()将資料項添加到堆棧頂。 使用不帶顯式索引的 pop()從堆棧頂部彈出資料。

stack = [11,22,33,44]
stack.append(55)
stack.append(66)  #壓棧
stack   #[11,22,33,44,55,66]
stack.pop() #66 彈棧
stack   #[11,22,33,44,55]
stack.pop() #55 彈棧
stack   #[11,22,33,44]           

把 list 當作隊列

也同樣可以将 list 用作隊列,第一個添加進去的元素,先被彈出("先進先出"),然後 list 作為隊列的執行效率不是太高。雖然從清單末尾追加和彈出資料很快,但從清單開頭插入或彈出卻很慢(因為所有其他元素都必須移動一個)。

要實作隊列,使用 collections.deque,它可以實作從兩端進行快速添加和彈出。 例如:

from collections import deque
queue = deque(["apple", "orange", "banana"])
queue.append("Pear")    #壓棧
queue.append("peach")   #壓棧
queue.popleft()    #apple   左側彈棧
queue.popleft()     #orange   左側彈棧
queue      #deque(['banana', 'Pear', 'peach'])
queue.pop()   #peach   右側彈棧
queue      #deque(['banana', 'Pear'])           

list 推導式

清單推導式提供了一種建立 list 的簡潔方法。常見的應用場景是建立新清單,其中每個元素都是應用于另一個序列或可疊代對象的每個成員的某些操作的結果,或者建立滿足特定條件的那些元素的子序列。例如建立包含整數平方的 list:

squares = []
for x in range(10):
    squares.append(x**2)
    
squares   #[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
x #9           

變量 x 不斷的被新值覆寫,但是它在循環之後依然存在。可以使用以下方法計算沒有任何副作用的正方形清單:

squares = list(map(lambda x: x**2, range(10)))           

或者,更簡潔易懂的方式

squares = [x**2 for x in range(10)]           

list 推導式由括号組成,内部包含表達式,後面跟着 for 子句,然後是零個或多個 for 或 if 子句。 結果将是一個新清單,該清單是在其後的 for 和 if 子句的上下文中計算表達式而産生的。 例如,下面的 list 組合了兩個 list 的元素(兩個 list 中互不相同的元素):

data = [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]  
data #[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]           

注意當建立的 list 的元素是 tuple 類型是,推導式中的 tuple 資料必須放在()中,否則會報錯。

等同于下面的實作:

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)]           

更多例子:

list1 = [-3,-2,-1,0,1,2,3]
[x*2 for x in list1]   #[-6, -4, -2, 0, 2, 4, 6]
[x for x in list1 if x >= 0]   #[0, 1, 2, 3]
[abs(x) for x in vec]   #[3, 2, 1, 0, 1, 2, 3]

fruit = ["     apple", "orange     ", "     banana     "]
[f.strip() for f in fruit]   #['apple', 'orange', 'banana']
#生成包含元組tuple類型的元素,必須将資料放在()中,否則會報錯
[(x, x**2) for x in range(6)]   #[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]

list2 = [[1,2,3], [4,5,6], [7,8,9]]
[n for elem in list2 for n in elem]   #[1, 2, 3, 4, 5, 6, 7, 8, 9]           

list 推導式可以包含更複雜的表達式和嵌套函數:

from math import pi
[str(round(pi, i)) for i in range(1, 6)]   #['3.1', '3.14', '3.142', '3.1416', '3.14159']           

清單推導式嵌套

清單推導式中的初始表達式可以是任意表達式,可以包括另一個清單推導式。

# 定義3x4的數字矩陣
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]]           

等同于:

trans = []
for i in range(4):
    trans.append([row[i] for row in matrix])

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

還等同于:

trans = []
for i in range(4):
   trans_row = []
    for row in matrix:
        trans_row.append(row[i])
    trans.append(trans_row)

trans  #[[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)]           

del 語句

del 可以通過索引删除單個元素,也可以通過切片删除多個元素,或者整個 list。del 和 pop()的不同在于前者沒有傳回值,後者有傳回值。

data = [1, 2, 3, 4, 5, 6, 7, 8]
del data[0]
data #[2, 3, 4, 5, 6, 7, 8]
del data[1:3]   #[2, 5, 6, 7, 8]
del data[:]
data  #[]
del data  #删除整個 data