Python无iterable列表推导式条件不成立时返回空列表的写法
问题
以下是问题对应的代码运行与报错场景:
>>> x = 7 >>> res = [ 'True' if x > 1 and x < 5 ] File "<stdin>", line 1 res = [ 'True' if x > 1 and x < 5 ] ^ SyntaxError: invalid syntax >>> res = [ 'True' if x > 1 and x < 5 else 'False'] >>> res ['False']
需求:通过单行语法初始化列表res,当条件x > 1 and x < 5成立时,列表内写入值'True';条件不成立时列表为空。不需要使用带for循环的常规列表推导式。
解答
首先要明确:Python 语法不支持在列表字面量内直接使用不带else的三元表达式,而带else的三元表达式无论条件是否成立,都会固定生成一个值作为列表元素,因此不可能通过替换else后的'False'实现条件不满足时列表为空的效果。
最简洁的单行实现方式是把三元判断放在列表外层:条件成立时返回包裹目标值的单元素列表,不成立时直接返回空列表,代码如下:
>>> x = 7 >>> res = ['True'] if x > 1 and x < 5 else [] >>> res [] >>> x = 3 >>> res = ['True'] if x > 1 and x < 5 else [] >>> res ['True']
这种写法没有冗余逻辑,可读性强,完全符合单行初始化的要求。
如果你一定要把判断逻辑写在方括号内部,可以利用可迭代对象解包的特性:条件成立时解包单元素的可迭代对象得到目标元素,条件不成立时解包空可迭代对象,不生成任何元素:
>>> res = [*('True' if x > 1 and x < 5 else ())]
这种写法效果和前者一致,但可读性稍差,更推荐第一种写法。
内容的提问来源于stack exchange,提问作者y_159
相关产品推荐
相关产品推荐

