條件清單理解

給定列表理解, 你可以附加一個或多個 if 條件來過濾值。

[<expression> for <element> in <iterable> if <condition>]

對於 <iterable> 中的每個 <element>; 如果 <condition> 評估為 True,則將 <expression>(通常是 <element> 的函式)新增到返回的列表中。

例如,這可以用於從整數序列中僅提取偶數:

[x for x in range(10) if x % 2 == 0]
# Out: [0, 2, 4, 6, 8]

現場演示

以上程式碼相當於:

even_numbers = [] 
for x in range(10):
    if x % 2 == 0:
        even_numbers.append(x)

print(even_numbers)
# Out: [0, 2, 4, 6, 8]

此外,形式 [e for x in y if c] 的條件列表理解(其中 ecx 的表示式)等同於 list(filter(lambda x: c, map(lambda x: e, y)))

儘管提供了相同的結果,但要注意前一個例子比後一個例子快 2 倍的事實。對於那些好奇的人來說,是一個很好的解釋原因。

請注意,這與 ... if ... else ... 條件表示式(有時稱為三元表示式 ) 完全不同,你可以將其用於列表推導的 <expression> 部分。請考慮以下示例:

[x if x % 2 == 0 else None for x in range(10)]
# Out: [0, None, 2, None, 4, None, 6, None, 8, None]

現場演示

這裡的條件表示式不是過濾器,而是一個運算子,用於確定要用於列表項的值:

<value-if-condition-is-true> if <condition> else <value-if-condition-is-false>

如果將它與其他運算子組合,這將變得更加明顯:

[2 * (x if x % 2 == 0 else -1) + 1 for x in range(10)]
# Out: [1, -1, 5, -1, 9, -1, 13, -1, 17, -1]

現場演示

如果你使用的是 Python 2.7,則 xrange 可能比 range 更好,原因有多種,如 xrange 文件中所述

[2 * (x if x % 2 == 0 else -1) + 1 for x in xrange(10)]
# Out: [1, -1, 5, -1, 9, -1, 13, -1, 17, -1]

以上程式碼相當於:

numbers = []
for x in range(10):
    if x % 2 == 0:
        temp = x
    else:
        temp = -1
    numbers.append(2 * temp + 1)
print(numbers)
# Out: [1, -1, 5, -1, 9, -1, 13, -1, 17, -1]

人們可以結合三元表示式和 if 條件。三元運算子處理過濾結果:

[x if x > 2 else '*' for x in range(10) if x % 2 == 0]
# Out: ['*', '*', 4, 6, 8]

只有三元運算子才能實現同樣的目標:

[x if (x > 2 and x % 2 == 0) else '*' for x in range(10)]
# Out:['*', '*', '*', '*', 4, '*', 6, '*', 8, '*']

另請參閱: 過濾器 ,它通常為條件列表推導提供了足夠的替代方法。