要在 Python 中通過僅提取或刪除現有列表(數組)中滿足特定條件的元素,或者通過執行替換或轉換來生成新列表,請使用列表推導。
此處解釋了以下內容以及示例代碼。
- 列表理解符號的基本形式
- 將該過程應用於列表的所有元素
- 從列表中提取和刪除滿足條件的元素
- 替換或轉換滿足列表條件的元素
有關字符串列表的具體示例,請參閱以下文章。
也可以隨機抽取不符合條件的元素。
請注意,列表可以存儲不同類型的數據,並且與數組完全不同。如果要在需要內存大小和內存地址的進程中處理數組或對大數據進行數值處理,請使用數組(標準庫)或 NumPy。
以下列表是一個示例
l = list(range(-5, 6))
print(l)
# [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
列表理解符號的基本形式
從列表生成新列表時,列表推導式比 for 循環更容易編寫。
[expression for any variable name in iterable object if conditional expression]
表達式應用於滿足可迭代對象(例如列表或元組)的條件表達式的元素,並成為新列表的元素。 “if 條件表達式”可以省略,在這種情況下,表達式適用於所有元素。
有關更多詳細信息,請參閱以下文章,包括嵌套列表理解表示法。
- 有關的:如何使用 Python 列表推導
將該過程應用於列表的所有元素
例如,如果您想對列表的所有元素應用一些處理,請在上面的列表理解表達式中描述所需的處理。
l_square = [i**2 for i in l]
print(l_square)
# [25, 16, 9, 4, 1, 0, 1, 4, 9, 16, 25]
l_str = [str(i) for i in l]
print(l_str)
# ['-5', '-4', '-3', '-2', '-1', '0', '1', '2', '3', '4', '5']
這可用於在數字列表和字符串列表之間進行轉換。
從列表中提取和刪除滿足條件的元素
如果元素只是被條件表達式選擇,它不會被表達式處理,所以它採用以下形式
[variable name for variable name in original list if conditional expression]
生成一個新列表,僅從中提取滿足條件的元素(條件表達式為真的元素)。
l_even = [i for i in l if i % 2 == 0]
print(l_even)
# [-4, -2, 0, 2, 4]
l_minus = [i for i in l if i < 0]
print(l_minus)
# [-5, -4, -3, -2, -1]
如果將“if條件表達式”設置為“if not條件表達式”,則它變為否定,並且只能選擇和提取不滿足條件的元素(條件表達式為假的元素)。換句話說,會生成一個新列表,從中刪除滿足條件的元素。
l_odd = [i for i in l if not i % 2 == 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]
l_plus = [i for i in l if not i < 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]
當然,不使用 not 指定等價的條件表達式也可以得到同樣的結果。
l_odd = [i for i in l if i % 2 != 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]
l_plus = [i for i in l if i >= 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]
條件表達式部分可以是多個條件。也可以使用負號。
l_minus_or_even = [i for i in l if (i < 0) or (i % 2 == 0)]
print(l_minus_or_even)
# [-5, -4, -3, -2, -1, 0, 2, 4]
l_minus_and_odd = [i for i in l if (i < 0) and not (i % 2 == 0)]
print(l_minus_and_odd)
# [-5, -3, -1]
替換或轉換滿足列表條件的元素
在上面的元素提取示例中,不滿足條件的元素被移除。
如果您只想對滿足條件的元素執行替換、轉換等,請將三元運算符應用於列表推導表示法的表達式部分。
在 Python 中,三元運算符可以寫成如下
True Value if Conditional Expression else False Value
a = 80
x = 100 if a > 50 else 0
print(x)
# 100
b = 30
y = 100 if b > 50 else 0
print(y)
# 0
它有點複雜,但是列表理解表示法和三元運算符的組合如下。
[True Value if Conditional Expression else False Value for any variable name in original list]
括號中的部分是三元運算符(實際代碼中不需要括號)。
[(True Value if Conditional Expression else False Value) for any variable name in original list]
如果任何變量名稱按原樣寫入真值或假值,則原始元素的值將按原樣使用。如果寫入表達式,則應用該表達式的處理。
l_replace = [100 if i > 0 else i for i in l]
print(l_replace)
# [-5, -4, -3, -2, -1, 0, 100, 100, 100, 100, 100]
l_replace2 = [100 if i > 0 else 0 for i in l]
print(l_replace2)
# [0, 0, 0, 0, 0, 0, 100, 100, 100, 100, 100]
l_convert = [i * 10 if i % 2 == 0 else i for i in l]
print(l_convert)
# [-5, -40, -3, -20, -1, 0, 1, 20, 3, 40, 5]
l_convert2 = [i * 10 if i % 2 == 0 else i / 10 for i in l]
print(l_convert2)
# [-0.5, -40, -0.3, -20, -0.1, 0, 0.1, 20, 0.3, 40, 0.5]