掌握 Python 列表推導(dǎo)式的六種方法
Python是一種簡潔而強(qiáng)大的編程語言,列表推導(dǎo)式(List Comprehensions)就是其中一個讓人愛不釋手的特性。列表推導(dǎo)式提供了一種簡潔的方式來創(chuàng)建列表,尤其是當(dāng)你需要對序列中的每個元素進(jìn)行某種操作或過濾時。今天,我們就來詳細(xì)探討并掌握Python列表推導(dǎo)式的六種方法。
1. 基礎(chǔ)列表推導(dǎo)式
列表推導(dǎo)式的基本語法是 [表達(dá)式 for 項(xiàng) in 可迭代對象]。它允許你通過一個表達(dá)式和for循環(huán)來快速生成一個新的列表。
# 創(chuàng)建一個包含1到10的平方的列表
squares = [x**2 for x in range(1, 11)]
print(squares)
# 輸出: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
這段代碼用一行就實(shí)現(xiàn)了過去可能需要幾行代碼才能完成的任務(wù)。
2. 添加條件過濾
除了基本表達(dá)式,列表推導(dǎo)式還可以包含if語句,用于過濾元素。
# 創(chuàng)建一個包含1到10中偶數(shù)的平方的列表
even_squares = [x**2 for x in range(1, 11) if x % 2 == 0]
print(even_squares)
# 輸出: [4, 16, 36, 64, 100]
這里,if x % 2 == 0 用于過濾掉奇數(shù),只保留偶數(shù)進(jìn)行平方運(yùn)算。
3. 嵌套列表推導(dǎo)式
當(dāng)需要處理二維列表時,嵌套列表推導(dǎo)式可以派上用場。
# 創(chuàng)建一個3x3的矩陣,并將其轉(zhuǎn)置
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
transposed = [[row[i] for row in matrix] for i in range(3)]
print(transposed)
# 輸出: [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
這段代碼首先通過內(nèi)層列表推導(dǎo)式遍歷矩陣的每一列,然后通過外層列表推導(dǎo)式構(gòu)建轉(zhuǎn)置后的矩陣。
4. 使用多個for循環(huán)
列表推導(dǎo)式可以包含多個for循環(huán),用于處理更復(fù)雜的迭代需求。
# 創(chuàng)建一個笛卡爾積列表,包含(x, y)對,其中x來自[1, 2],y來自[3, 4]
cartesian_product = [(x, y) for x in [1, 2] for y in [3, 4]]
print(cartesian_product)
# 輸出: [(1, 3), (1, 4), (2, 3), (2, 4)]
這段代碼展示了如何通過兩個for循環(huán)來生成兩個列表的笛卡爾積。
5. 使用列表推導(dǎo)式進(jìn)行字符串處理
列表推導(dǎo)式不僅限于處理數(shù)字,還可以用于字符串處理。
# 將字符串中的每個字符轉(zhuǎn)換為大寫,并只保留字母字符
text = "Hello, World!"
upper_letters = [char.upper() for char in text if char.isalpha()]
print(upper_letters)
# 輸出: ['H', 'E', 'L', 'L', 'O', 'W', 'O', 'R', 'L', 'D']
這段代碼通過列表推導(dǎo)式將字符串中的每個字母字符轉(zhuǎn)換為大寫,并過濾掉非字母字符。
6. 結(jié)合函數(shù)使用列表推導(dǎo)式
列表推導(dǎo)式還可以與自定義函數(shù)結(jié)合使用,以實(shí)現(xiàn)更復(fù)雜的操作。
# 定義一個函數(shù),計(jì)算一個數(shù)的階乘
def factorial(n):
if n == 0 or n == 1:
return 1
else:
return n * factorial(n - 1)
# 計(jì)算5以內(nèi)所有整數(shù)的階乘
factorials = [factorial(i) for i in range(6)]
print(factorials)
# 輸出: [1, 1, 2, 6, 24, 120]
這里,我們定義了一個計(jì)算階乘的函數(shù),并在列表推導(dǎo)式中調(diào)用它來計(jì)算5以內(nèi)所有整數(shù)的階乘。
實(shí)戰(zhàn)案例:分析學(xué)生成績
假設(shè)我們有一個學(xué)生成績列表,每個學(xué)生包含姓名和成績。我們希望計(jì)算所有學(xué)生的平均成績,并找出成績高于平均分的學(xué)生。
# 學(xué)生成績列表
students = [
{"name": "Alice", "score": 85},
{"name": "Bob", "score": 92},
{"name": "Charlie", "score": 78},
{"name": "David", "score": 90},
{"name": "Eva", "score": 88}
]
# 計(jì)算平均成績
average_score = sum(student["score"] for student in students) / len(students)
print(f"平均成績: {average_score}")
# 輸出: 平均成績: 86.6
# 找出成績高于平均分的學(xué)生
above_average = [student["name"] for student in students if student["score"] > average_score]
print(f"成績高于平均分的學(xué)生: {above_average}")
# 輸出: 成績高于平均分的學(xué)生: ['Bob', 'David', 'Eva']
在這個案例中,我們首先使用列表推導(dǎo)式計(jì)算所有學(xué)生的總成績,然后除以學(xué)生人數(shù)得到平均成績。接著,再次使用列表推導(dǎo)式找出成績高于平均分的學(xué)生姓名。
總結(jié)
通過本文,我們學(xué)習(xí)了Python列表推導(dǎo)式的6種常用方法:基礎(chǔ)列表推導(dǎo)式、添加條件過濾、嵌套列表推導(dǎo)式、使用多個for循環(huán)、進(jìn)行字符串處理以及結(jié)合函數(shù)使用。列表推導(dǎo)式不僅讓代碼更加簡潔,還提高了執(zhí)行效率。在實(shí)際編程中,熟練掌握列表推導(dǎo)式可以大大提升你的編程能力和代碼質(zhì)量。