2012-07-23 153 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