我正在寻找一个基于布尔表达式展平元组序列的生成器。我的数据如下:
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
答案 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]