关于python:列表中的if else

if else in a list comprehension

本问题已经有最佳答案,请猛点这里访问。

我有一张单子l

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

其中expression的格式稍有不同(考虑在句子中转换主语和动词顺序)。

因此,您的代码[x+1 for x in l if x >= 45]执行以下操作:

1
2
3
for x in l:
    if x >= 45:
        x+1

但是,此代码[x+1 if x >= 45 else x+5 for x in l]执行此操作(在重新排列expression之后):

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]

[错误,正确][条件]是语法


就像在[a if condition1 else b for i in list1 if condition2]中,两个ifcondition1condition2做了两件不同的事情。(a if condition1 else b)部分来自lambda表达式:

1
lambda x: a if condition1 else b

另一个condition2是另一个lambda:

1
lambda x: condition2

整体清单理解可以看作是mapfilter的组合:

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 ]

但它开始看起来有点难看,所以你最好使用一个正常的循环。注意,我在列表变量中使用了v而不是l,以减少与数字1的混淆(我认为在任何情况下,甚至在快速和肮脏的示例代码中,都应避免使用lO)。