2014-09-10 22 views
1

我知道下面的代碼是有效的:如果沒有別的 - Python列表

list = [1 , 2 if 1==1 else 0, 3] 

,但我怎麼能忽略列表中插入如果如果表達式(1 == 1在這種情況下)返回false?

我的意思是,我不希望插入的任何值(包括「無」,「[]」),如果表達式無效。

我想是這樣的

list = [1 , 2 if 1==1, 3] 

,但它不工作。

+0

Downvoter請留下評論 – almanegra 2014-09-10 20:36:56

+4

請注意,你有什麼不是列表理解,它只是一個普通的列表。 – BrenBarn 2014-09-10 20:37:38

+0

如何在沒有'else'的情況下完成任務?此外,這與列表無關。 – agconti 2014-09-10 20:39:16

回答

5

以任選地包括在列表中的項目,你就必須打破分配到幾個部分:

l = [1] + ([2] if 1 else []) + [3] 

(括號可能是可選的,但也不能傷害,我不。確保條件表達式有什麼優先)

這是寫作的一小段路

if 1: 
    l = [1] + [2] + [3] # Which is just [1,2,3] 
else: 
    l = [1] + [] + [3] # Which is just [1,3] 

在文字必須存在一個列表中指定的任何元素;沒有辦法在Python中編寫可能不存在的項目。


如果你熟悉Perl,類似東西可能的,但僅僅是因爲Perl有非常不同的語義。

比較分配

@list = (1, 0 ? 2 :(), 3) 

將產生列表(1, 3)因爲(1,(), 3)被解釋爲3所列出(1,),(), and (3,)串聯,部分原因是因爲你不能其他列表裏面嵌套列表。另一方面

@list = (1, 1 ? 2 :(), 3) 

產生列表(1, 2, 3)

+0

這是比接受的更好的答案,因爲它實際上解決了問題。 +1 – Shashank 2014-09-10 21:10:53

7

你不能這樣用,因爲你正在用三個值定義一個文字列表。通過在括號之間放置兩個逗號和三個表達式,您已經承諾在列表中提供三個元素。如果沒有評估某些東西,就沒有辦法表達「消失」。

在實際列表理解,您可以通過將iffor子句中,而不是在目標表達式做到這一點:

>>> x = [1, 2, 3, 4] 
>>> [a if a != 3 else 'three' for a in x] 
[1, 2, 'three', 4] 
>>> [a for a in x if a != 3] 
[1, 2, 4] 

首先理解使用條件表達式a if a != 3 else 'three',其中必須有既有ifelse部分,因爲表達式必須評估爲某個值。第二種理解使用if a !=3,因爲它是列表理解語法的一部分;它不是條件表達式的一部分,在這種情況下不能包含else。它的工作就是簡單地將x中的哪些值分配給a,而不是評估本身的值。

+0

請注意,這並不能解決OP對列表的* single *元素的存在應用條件的問題。這將'a!= 3'條件應用於整個列表。儘管這個答案中的信息是正確的,但並不完全相關。 – Shashank 2014-09-10 20:47:55

+2

這很有意義,因爲第一句話解釋說你不能有一個元素可以作爲失敗測試的結果「消失」。 – chepner 2014-09-10 20:54:52

+0

@chepner我的錯誤,我應該更具體一些,答案的第二部分中的信息是無關緊要的。 – Shashank 2014-09-10 21:10:03