一文帶您精通 Python 列表:操作方法、技巧與最佳實踐
列表(list)是 Python 中最常見且最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)之一,它是一個存儲對象的容器,可以包含任何類型的對象,包括字符串、數(shù)字,甚至其他對象。列表還可以混合存儲不同類型的數(shù)據(jù)。掌握列表的各種操作,如創(chuàng)建、添加、排序等,不僅可以提高編程效率,還能簡化數(shù)據(jù)處理過程。
基本操作
接下來將了解添加、移除或訪問列表元素的不同方法。從添加元素的方法開始。
添加元素
可以使用 append() 方法在列表末尾添加一個元素,或者使用 insert() 方法在指定位置添加一個元素。對于添加多個元素,最好的方法是使用 extend()。
fruits = ['apple', 'banana']
# Adds at the end
fruits.append('cherry')
fruits
圖片
# Inserts at position 1
fruits.insert(1, 'orange')
fruits
圖片
# Adds multiple items
fruits.extend(['date', 'elderberry',100])
fruits
圖片
- append() 和 extend() 在各自的用途上都很高效。append() 具有常數(shù)時間復(fù)雜度,使其在添加單個元素時非常高效。
- insert():對于較長的列表來說,可能效率不高,因為列表中的所有后續(xù)元素可能需要移動以為新元素騰出空間。
- extend() 比在循環(huán)中使用 append() 添加多個元素更高效,因為它最小化了反復(fù)調(diào)整列表大小的開銷。
移除元素
移除元素的方法有多種:
- 使用 del 根據(jù)索引或切片刪除元素。
- 使用 pop() 刪除指定位置的元素(如果沒有指定位置,則刪除最后一個元素)。
- 使用 remove() 根據(jù)值刪除元素。
# Removes by value
fruits.remove('banana')
fruits
圖片
popped_fruit = fruits.pop(2)
print(popped_fruit)
fruits
圖片
del fruits[0]
fruits
圖片
- remove(value):刪除給定值的第一個實例。當(dāng)你知道要刪除的值但不知道其位置時,這個方法非常有用。
- pop(index):刪除指定位置的對象并返回它。如果未提供索引,則刪除并返回最后一個元素。當(dāng)你確切知道要刪除的對象的位置或需要返回已刪除的對象時,這個方法非常適合。
- del list[index]:從給定的切片或索引中刪除項目。被刪除的對象不會被返回。當(dāng)你根據(jù)位置刪除切片或項目且不需要返回已刪除的對象時,這個方法非常理想。
訪問元素和切片
使用元素的索引是訪問列表中元素的簡單方法。對列表進(jìn)行切片可以獲取其中的一個子集。
first_fruit = fruits[0]
first_fruit
圖片
# Gets a slice from index 1 to 2
fruit_slice = fruits[1:3]
fruit_slice
圖片
- 索引訪問:當(dāng)需要列表中的特定元素時,這是理想的方法。就像從書架上選擇一本書,確切地知道它的位置。
- 切片:適用于多種需求。就像在書架上選擇兩個位置之間的一系列書。
搜索和排序列表
搜索元素
in 關(guān)鍵字可以用來檢查列表中是否存在某個元素。使用 index() 方法可以進(jìn)行更深入的搜索,例如確定某個元素的索引。以下是相關(guān)代碼。
fruits = ['apple', 'banana', 'cherry']
# Returns True if 'banana' is in the list
is_banana_present = 'banana' in fruits
is_banana_present
圖片
# Gets the index of 'banana'
banana_index = fruits.index('banana')
banana_index
排序列表
sort() 方法用于就地排序,會直接修改原始列表,使排序變得簡單。使用 sorted() 可以獲取排序后的列表副本,而不改變原始列表。
numbers = [3, 1, 4, 1, 5, 9, 2]
# Sorts the list in-place
numbers.sort()
print(numbers)
# Returns a new sorted list. The original remains unchanged
sorted_numbers = sorted(numbers)
sorted_numbers
反轉(zhuǎn)列表
使用 reverse() 方法可以就地反轉(zhuǎn)列表,或者使用步長為 -1 的切片來創(chuàng)建一個反轉(zhuǎn)的列表副本。
numbers.reverse()
numbers
圖片
reversed_numbers = numbers[::-1]
reversed_numbers
圖片
- 使用 reverse() 方法,當(dāng)你需要反轉(zhuǎn)列表元素且不再需要原始順序時。
- 使用步長為 -1 的切片,當(dāng)你需要一個反轉(zhuǎn)版本的列表,同時保留原始列表的順序以供進(jìn)一步使用時。
高級列表操作技巧
上面描述了基本的列表方法和技巧,讓我們來看看一些更高級的列表操作技巧。
列表推導(dǎo)式用于簡潔高效的循環(huán)
列表推導(dǎo)式( list comprehensions)是一種基于現(xiàn)有列表創(chuàng)建新列表的簡單方法。它類似于用一行代碼編寫一個循環(huán)。這在應(yīng)用于數(shù)據(jù)科學(xué)的轉(zhuǎn)換數(shù)據(jù)或過濾數(shù)據(jù)時非常有用。
# Creates a list of squares
squares = [x**2 for x in range(10)]
squares
圖片
通過添加條件來實現(xiàn)偶數(shù)的平方列表:
even_squares = [x**2 for x in range(10) if x % 2 == 0]
even_squares
圖片
嵌套列表和矩陣操作
列表中的列表稱為嵌套列表。在數(shù)據(jù)科學(xué)中,它們常用于表示矩陣或二維數(shù)據(jù)。
# A 3x3 matrix
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(matrix)
first_row = matrix[0]
first_row
圖片
使用 filter()、map() 和 reduce() 方法處理列表
這些方法為列表的函數(shù)式編程交互提供了工具:
- filter() 根據(jù)條件選擇項目。
- map() 對每個項目應(yīng)用一個函數(shù)。
- reduce() 將所有項目聚合為一個輸出。
現(xiàn)在讓我們逐一應(yīng)用它們。首先創(chuàng)建一個列表并進(jìn)行過濾。以下是代碼示例:
from functools import reduce
# 創(chuàng)建一個列表
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 使用 filter() 選擇偶數(shù)
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)
# 使用 map() 將每個數(shù)字平方
squared_numbers = list(map(lambda x: x ** 2, numbers))
print(squared_numbers)
# 使用 reduce() 計算所有數(shù)字的和
sum_of_numbers = reduce(lambda x, y: x + y, numbers)
print(sum_of_numbers)
圖片
處理列表副本
在處理 Python 列表副本時,有兩種類型的副本:淺拷貝(Shallow copies)和深拷貝(Deep copies)。
盡管淺拷貝會創(chuàng)建一個新列表,但它不會復(fù)制其內(nèi)部的元素。這意味著,如果你有嵌套列表,原始列表和副本將共享這些嵌套列表。另一方面,深拷貝完全獨立于原始列表,因為它會生成一個新列表,并復(fù)制其中的每個元素。
淺拷貝(Shallow copies
import copy
original_list = [[1, 2, 3], [4, 5, 6]]
shallow_copied_list = copy.copy(original_list)
shallow_copied_list[0][0] = 'changed'
print(f"{original_list=}")
print(f"{shallow_copied_list=}")
圖片
深拷貝(Deep copies)
import copy
original_list = [[1, 2, 3], [4, 5, 6]]
shallow_copied_list = copy.deepcopy(original_list)
shallow_copied_list[0][0] = 'changed'
print(f"{original_list=}")
print(f"{shallow_copied_list=}")
在數(shù)據(jù)中處理復(fù)雜數(shù)據(jù)結(jié)構(gòu)時,了解淺拷貝和深拷貝之間的區(qū)別對于防止意外后果至關(guān)重要。
列表操作的提示
- 構(gòu)建列表時使用列表推導(dǎo)式而不是循環(huán),它們通常更快且更易于理解。
- 減少在循環(huán)中操作:在可能的情況下,使用列表推導(dǎo)式或 map() 生成列表比在循環(huán)中附加更有效。
- 注意淺拷貝和深拷貝:了解其區(qū)別以防止意外修改。
- 不要過度使用列表推導(dǎo)式:盡管功能強(qiáng)大,但如果過于復(fù)雜,可能會變得難以閱讀,保持簡單和整潔。
上述探討了Python列表的多種方法與技巧,從基本操作如添加、刪除和訪問元素,到高級技巧如列表推導(dǎo)式、嵌套列表和函數(shù)式編程方法。理解淺拷貝和深拷貝的區(qū)別、合理使用列表推導(dǎo)式等優(yōu)化技巧,有助于提高編程效率和簡化數(shù)據(jù)處理。掌握這些方法對于數(shù)據(jù)科學(xué)、數(shù)據(jù)分析的編程至關(guān)重要。