2010-12-10 50 views
253

我有一个列表l如果别人在列表理解

l = [22, 13, 45, 50, 98, 69, 43, 44, 1] 

对于上面的数字45包容性,我想加1;和数字低于它,5

我试图

[x+1 for x in l if x >= 45 else x+5] 

但它给了我一个语法错误。如何在列表理解中实现这样的ifelse

回答

309
>>> 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] 

执行 - 的东西,如果<condition>,否则做,别的东西。

+2

可能应该在底部的解释中使用与`x`不同的变量作为条件,因为在本例中不使用`x`作为条件。 – tscizzle 2015-04-17 20:03:37

+0

如果条件满足,那么只有在列表中包含变量才可以呢?其他的只是通过? – 2016-07-25 16:38:57

78

您必须将表达式放在列表理解的开始处,结尾处的if语句过滤元素!

[x+1 if x >= 45 else x+5 for x in l] 
+17

+1,用于在理解开始时和结束时明确区分条件的作用。你也可以同时做两件事;例如''上'如果item.isupper()否则'下'的项目'Omg!薄煎饼!!!'如果item.isalpha()]` – Air 2013-10-14 21:55:31

+0

现在我明白了排序逻辑。谢谢你们俩。 – otocan 2017-07-07 11:41:39

104
[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:

[a for i in items if C else b] 

The right form is:

[a if C else b for i in items] 

Even though there is a valid form:

[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:

[a if tC else b for i in items if fC] 
6

你可以移动有条件的:

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在任何情况下都应该作为变量名避免,即使在快速肮脏的示例代码中也是如此)。

173

你得到这个错误的原因与列表理解的执行方式有关。

请记住以下几点:

[ expression for item in list if conditional ] 

等同于:

for item in list: 
    if conditional: 
     expression 

expression是在一个稍微不同的格式(觉得切换一个句子的主语和动词顺序)。

因此,您的代码[x+1 for x in l if x >= 45]做到这一点:

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

但是,此代码[x+1 if x >= 45 else x+5 for x in l]做到这一点(重排expression后):

for x in l: 
    if x>=45: x+1 
    else: x+5 
12

你也可以把条件表达式中括号内列表理解:

l = [22, 13, 45, 50, 98, 69, 43, 44, 1] 
    print [[x+5,x+1][x >= 45] for x in l] 

[false,true] [condition]是语法

6

我刚刚有一个类似的问题,发现这个问题和答案真的很有用。这是我感到困惑的部分。我明确地写了它,因为没有人真正用英文表示它:

迭代结束。

通常情况下,一个循环将

for this many times: 
    if conditional: 
     do this thing 
    else: 
     do something else 

大家指出列表理解部分简单地作为第一个答案一样,

[ expression for item in list if conditional ] 

但实际上不是你在这种情况下做什么。 (我试图这样做的)

在这种情况下,它更像是这样的:

[ expression if conditional else other thing for this many times ] 
5

[a if condition1 else b for i in list1 if condition2],两个if s的condition1condition2做两件不同的事情。部分(a if condition1 else b)是从一个lambda表达式:

lambda x: a if condition1 else b 

而另一condition2是另一个lambda:

lambda x: condition2 

所有列表解析可以看作的mapfilter组合:

map(lambda x: a if condition1 else b, filter(lambda x: condition2, list1))