首页 > 解决方案 > 列表推导中的多个 if/else

问题描述

我正在尝试学习列表理解并在可迭代对象上使用条件。我不明白我的if/else状况如何在此列表中起作用。哪个ifelse首先工作并打印?

num1 = [5, 10, 15]
num2 = [i**2 if i == 10 else i - 5 if i < 7 else i + 5 for i in num1]
print(num2)

输出:

[0, 100, 20]

标签: pythonif-statementconditional-statementslist-comprehension

解决方案


您在这里拥有的不是带有条件的列表推导(过滤掉推导的某些元素),而是形式的后表达式条件

x = A if (condition) else B

如果(条件)为真,则分配 A,否则分配 B。(语法看起来有点混乱,必须承认,但即使 Python 也并不总是完美的。)您已经设法将其中两个堆叠在里面彼此,像这样:

i**2 if i == 10 else (i-5 if i < 7 else i+5)

从右边阅读:表达式(i-5 if i < 7 else i+5)会给你i-5if i<7,否则你会得到i+5。无论这是什么值,只要为假,它就会包含在理解i==10中(因此,对于第一个和第三个列表元素)。

请注意,此构造与列表推导无关;您可以在任何地方使用它(只要i定义)。

i = 31
x = i**2 if i == 10 else (i-5 if i < 7 else i+5)

为了比较,这是一个真正的条件列表推导:推导将删除等于 10 的值,在结果中留下两个元素。我认为这是您要理解的结构。

num3 = [ i**2 for i in num1 if i != 10 ]

推荐阅读