if else in a list comprehension
我有一张单子
1 | l = [22, 13, 45, 50, 98, 69, 43, 44, 1] |
对于大于45的数字,我想加1;小于45的数字加5。
我试过
1 | [x+1 for x in l if x >= 45 else x+5] |
但它给了我一个语法错误。如何在列表理解中实现这样的EDOCX1[1]ndash;EDOCX1[2]
1 2 3 | >>> l = [22, 13, 45, 50, 98, 69, 43, 44, 1] >>> [x+1 if x >= 45 else x+5 for x in l] [27, 18, 46, 51, 99, 70, 48, 49, 6] |
如果是
这个错误的原因与列表理解的执行方式有关。
请记住以下几点:
1 | [ expression for item in list if conditional ] |
相当于:
1 2 3 | for item in list: if conditional: expression |
其中
因此,您的代码
1 2 3 | for x in l: if x >= 45: x+1 |
但是,此代码
1 2 3 | for x in l: if x>=45: x+1 else: x+5 |
1 | [x+1 if x >= 45 else x+5 for x in l] |
为了获得奖励,这里是我第一次犯这个错误时写的评论:
Python's conditional expression is
a if C else b and can't be used as:
1 [a for i in items if C else b]The right form is:
1 [a if C else b for i in items]Even though there is a valid form:
1 [a for i in items if C]But that isn't the same as that is how you filter by
C , but they can be combined:
1 [a if tC else b for i in items if fC]
您必须将表达式放在列表理解的开头,并在末尾的if语句中过滤元素!
1 | [x+1 if x >= 45 else x+5 for x in l] |
您还可以将条件表达式放在列表理解中的括号中:
1 2 | l = [22, 13, 45, 50, 98, 69, 43, 44, 1] print [[x+5,x+1][x >= 45] for x in l] |
[错误,正确][条件]是语法
就像在
1 | lambda x: a if condition1 else b |
另一个
1 | lambda x: condition2 |
整体清单理解可以看作是
1 | map(lambda x: a if condition1 else b, filter(lambda x: condition2, list1)) |
我刚刚遇到了一个类似的问题,发现这个问题和答案非常有用。这是我困惑的部分。我写得很明确,因为没有人简单地用英语说:
迭代在最后进行。
通常,一个循环
1 2 3 4 5 | for this many times: if conditional: do this thing else: do something else |
每个人都像第一个答案一样简单地陈述清单理解部分,
1 | [ expression for item in list if conditional ] |
但事实上这不是你在本案中所做的。(我想那样做)
在这种情况下,更像是这样:
1 | [ expression if conditional else other thing for this many times ] |
您可以将条件移动到:
1 2 | v = [22, 13, 45, 50, 98, 69, 43, 44, 1] [ (x+1 if x >=45 else x+5) for x in v ] |
但它开始看起来有点难看,所以你最好使用一个正常的循环。注意,我在列表变量中使用了