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