列表推導式:Python簡潔創建列表的技巧(適合初學者)

在Python中,我們經常需要創建列表。比如,想生成1到10的平方數,或者從一個列表中篩選出偶數。如果用傳統的for循環和append()方法,代碼可能會比較冗長。有沒有更簡單的方式呢?答案是:列表推導式!

什麼是列表推導式?

列表推導式是Python中一種簡潔創建列表的方法,它允許我們在一行代碼中完成循環和元素處理,生成新的列表。簡單來說,就是用更少的代碼實現列表的創建。

爲什麼要用列表推導式?

舉個例子:如果想生成1到10的平方數,傳統方法需要寫循環和append()

# 傳統方法
squares = []
for i in range(1, 11):  # 循環1到10
    squares.append(i ** 2)  # 計算平方並添加到列表
print(squares)  # 輸出:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

而用列表推導式,只需一行代碼:

# 列表推導式
squares = [i ** 2 for i in range(1, 11)]
print(squares)  # 輸出:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

好處:代碼更簡潔、可讀性更高,不需要重複寫append(),一行搞定列表創建。

基本語法結構

列表推導式的核心格式是:
[表達式 for 變量 in 可迭代對象]

  • 表達式:對變量的操作(比如i**2i*2、字符串處理等),最終結果會成爲列表的元素。
  • 變量:循環中的每個元素(比如i,可以是任何合法的變量名)。
  • 可迭代對象:能被循環遍歷的對象(比如range()、列表、元組等,常見的是range())。

不帶條件的列表推導式

如果只想對可迭代對象中的每個元素做統一處理(無篩選),直接用基本語法即可。

例子1:生成1到10的平方數

squares = [i ** 2 for i in range(1, 11)]
print(squares)  # 輸出:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

例子2:生成1到5的偶數倍

even_multiples = [i * 2 for i in range(1, 6)]  # i從1到5,每個乘2
print(even_multiples)  # 輸出:[2, 4, 6, 8, 10]

帶條件的列表推導式

如果需要篩選元素(比如只保留偶數),可以在語法後加上if 條件。格式變爲:
[表達式 for 變量 in 可迭代對象 if 條件]

例子3:篩選1到10中的偶數
傳統方法:

evens = []
for i in range(1, 11):
    if i % 2 == 0:  # 判斷是否爲偶數
        evens.append(i)
print(evens)  # 輸出:[2, 4, 6, 8, 10]

列表推導式:

evens = [i for i in range(1, 11) if i % 2 == 0]
print(evens)  # 輸出:[2, 4, 6, 8, 10]

例子4:篩選大於3的偶數

result = [i for i in range(1, 11) if i > 3 and i % 2 == 0]
print(result)  # 輸出:[4, 6, 8, 10]

更靈活的表達式

列表推導式的“表達式”可以是任何合法的Python操作,比如字符串處理、函數調用等。

例子5:將列表中的名字轉爲大寫

names = ['alice', 'bob', 'charlie']
upper_names = [name.upper() for name in names]  # name.upper()是字符串大寫方法
print(upper_names)  # 輸出:['ALICE', 'BOB', 'CHARLIE']

例子6:對列表中的數字取絕對值

numbers = [-1, 2, -3, 4, -5]
abs_numbers = [abs(num) for num in numbers]  # abs()是取絕對值函數
print(abs_numbers)  # 輸出:[1, 2, 3, 4, 5]

注意:列表推導式 vs 生成器表達式

  • 列表推導式:用[],直接生成完整列表,佔用內存。
  • 生成器表達式:用(),生成的是“惰性序列”,需逐個迭代,節省內存。初學者先掌握列表推導式即可。

總結

列表推導式的核心優勢是簡潔高效,能讓代碼更緊湊、可讀性更強。通過對比傳統循環和列表推導式,你會發現它能大幅減少代碼量。

練習建議:嘗試用列表推導式改寫之前用for循環+append()的代碼,比如生成1到20的立方數、篩選列表中的負數等。多練幾次,就能熟練掌握這種寫法啦!

小夜