2012-07-23 152 views
3

我正在尋找一個將根據布爾表達式將元組序列扁平化的生成器。我的數據是這樣的:使用布爾表達式生成器展平序列

my_data = ((3, 4), (None, 4), (5, 8), (None, 1), (None, 9)...) 

我想要做的就是擊敗送進我採取的第一項中的每個元組,如果它不是None數的一所維生成它,否則,拿第二項目。我的結果將產生以下順序:

3, 4, 5, 1, 9... 

我想這樣做是使用帶有短路布爾表達式的最簡單的方法,但我似乎無法構成一個合適的發電機。我意識到我可以定義一個生成器函數,這將是相當直接的,但我很好奇,如果這可以通過理解來完成?

我嘗試:

(x or y for subitem in my_data for x, y in subitem) 

回溯:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 1, in <genexpr> 
TypeError: 'int' object is not iterable 

回答

3

恐怕你需要檢查None明確,或者像這樣的元組0或(0, 1)將跳閘您:

(x if x is not None else y for x,y in my_data) 

實施例:

>>> my_data = ((3, 4), (None, 4), (5, 8), (None, 1), (0, None), (0, 1)) 
>>> [x or y for x,y in my_data] 
[3, 4, 5, 1, None, 1] 
>>> [x if x is not None else y for x,y in my_data] 
[3, 4, 5, 1, 0, 0] 
+0

對於我的用例,只有在非零值時纔可用,否則它不是,但是非常重要。欣賞它。 – donopj2 2012-07-23 09:54:08

7
(x[0] or x[1] for x in my_data) 

或替代,

(x or y for x,y in my_data) 
+1

此失敗上'my_data =((3,4),(無,4),(5,8),(無,1),(0,None))'。 – 2012-07-23 09:14:17

+0

帕特里克已經澄清說,在元組的第一個位置永遠不會有零,所以我的觀點是沒有意義的。我現在不能滿足你的答案 - 我已經用完了今天的所有選票...... – 2012-07-23 17:21:38