如果其他人在列表中的理解

我有一个列表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] 

但它给我一个语法错误。 我怎样才能达到一个if在列表理解中这样呢?

 >>> 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>做某事,否则做别的。

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

请记住以下几点:

 [ 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 
 [x+1 if x >= 45 else x+5 for x in l] 

而为了奖励,这里是评论,我写了第一次记住这个错误:

Python的条件expression式是a if C else b ,不能用作:

 [a for i in items if C else b] 

正确的forms是:

 [a if C else b for i in items] 

即使有一个有效的表单:

 [a for i in items if C] 

但这不是一样的,你是如何过滤C ,但他们可以结合起来:

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

你必须把expression式放在列表理解的开头,if语句在结尾过滤元素!

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

您也可以将条件expression式放在括号内的列表理解中:

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

[false,true] [condition]是语法

您可以将条件移动到:

 v = [22, 13, 45, 50, 98, 69, 43, 44, 1] [ (x+1 if x >=45 else x+5) for x in v ] 

但是它开始显得有点丑陋,所以你最好使用正常循环。 请注意,我使用v而不是l作为列表variables,以减less与数字1的混淆(我认为在任何情况下, lO都应该作为variables名避免,即使在快速和肮脏的示例代码中)也是如此。

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

迭代进行到最后。

通常情况下,一个循环

 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 ] 

就像在[a if condition1 else b for i in list1 if condition2] ,两个if s与condition1condition2做两个不同的事情。 部分(a if condition1 else b)来自lambdaexpression式:

 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))