列表推导中的多个 if/else
Multiple if/else on list comprehensions
我正在尝试学习列表理解和在可迭代对象上使用条件。我不明白我的 if
/else
条件在这个列表上是如何工作的。 if
或 else
哪个先工作并打印?
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]
你在这里得到的不是带条件的列表推导(过滤掉推导的一些元素),而是 post-expression conditional
x = A if (condition) else B
如果(条件)为真,则赋值A,否则赋值B。(语法看起来有点混乱,必须承认,但即使是Python也不总是完美的。)你我设法将其中两个堆叠在一起,如下所示:
i**2 if i == 10 else (i-5 if i < 7 else i+5)
从右边读:如果 i<7
,表达式 (i-5 if i < 7 else i+5)
将得到 i-5
,否则得到 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 ]
要真正了解嵌套三元组的工作原理,您可以编写等效的分支语句:
num2 = []
for i in num1:
val = i
if i == 10:
val **= 2
elif i < 7:
val -= 5
else:
val += 5
num2.append(val)
请注意,无论 i
是什么,val
总是被赋值。这是三元表达式的要求。
一般来说,三元表达式遵循以下形式
x = expr_if_true if some_condition else expr_if_false
相当于
if some_condition:
x = expr_if_true
else:
x = expr_if_false
请注意 expr_if_true
和 expr_if_false
可以是 任何有效的 Python 表达式,包括其他三元表达式。这是三元表达式可以嵌套的机制,这特别有效,因为三元表达式 always 有一个 return 值。
综上所述,这是一种糟糕的代码编写方式。三元表达式应该限制在单层,MAYBE 一层嵌套,如果它可以写得简洁易读。
我正在尝试学习列表理解和在可迭代对象上使用条件。我不明白我的 if
/else
条件在这个列表上是如何工作的。 if
或 else
哪个先工作并打印?
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]
你在这里得到的不是带条件的列表推导(过滤掉推导的一些元素),而是 post-expression conditional
x = A if (condition) else B
如果(条件)为真,则赋值A,否则赋值B。(语法看起来有点混乱,必须承认,但即使是Python也不总是完美的。)你我设法将其中两个堆叠在一起,如下所示:
i**2 if i == 10 else (i-5 if i < 7 else i+5)
从右边读:如果 i<7
,表达式 (i-5 if i < 7 else i+5)
将得到 i-5
,否则得到 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 ]
要真正了解嵌套三元组的工作原理,您可以编写等效的分支语句:
num2 = []
for i in num1:
val = i
if i == 10:
val **= 2
elif i < 7:
val -= 5
else:
val += 5
num2.append(val)
请注意,无论 i
是什么,val
总是被赋值。这是三元表达式的要求。
一般来说,三元表达式遵循以下形式
x = expr_if_true if some_condition else expr_if_false
相当于
if some_condition:
x = expr_if_true
else:
x = expr_if_false
请注意 expr_if_true
和 expr_if_false
可以是 任何有效的 Python 表达式,包括其他三元表达式。这是三元表达式可以嵌套的机制,这特别有效,因为三元表达式 always 有一个 return 值。
综上所述,这是一种糟糕的代码编写方式。三元表达式应该限制在单层,MAYBE 一层嵌套,如果它可以写得简洁易读。