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


































