使用布尔表达式生成器展平序列

时间:2012-07-23 09:03:26

标签: python list-comprehension

我正在寻找一个基于布尔表达式展平元组序列的生成器。我的数据如下:

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

2 个答案:

答案 0 :(得分:7)

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

或者,

(x or y for x,y in my_data)

答案 1 :(得分:3)

我担心您需要明确检查None,否则像(0, None)(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]