條件清單理解
給定列表理解, 你可以附加一個或多個 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]
的條件列表理解(其中 e
和 c
是 x
的表示式)等同於 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, '*']
另請參閱: 過濾器 ,它通常為條件列表推導提供了足夠的替代方法。