给定一个列表xs:

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

大于45的,加1;对于小于45的数,加5。


当前回答

我也遇到过类似的问题,发现这个问题和答案真的很有用。这是我困惑的地方。我把它写得很明确,因为没有人用英语简单地说明:

迭代在最后进行。

通常情况下,会有一个循环

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与condition1和condition2做了两件不同的事情。部分(a if condition1 else b)来自lambda表达式:

lambda x: a if condition1 else b

而另一个条件2是另一个lambda:

lambda x: condition2

整个列表的理解可以看作map和filter的组合:

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

我也遇到过类似的问题,发现这个问题和答案真的很有用。这是我困惑的地方。我把它写得很明确,因为没有人用英语简单地说明:

迭代在最后进行。

通常情况下,会有一个循环

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 ] 

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

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

[false,true][condition]是语法

得到这个错误的原因与列表推导的执行方式有关。

请记住以下几点:

[ expression for item in list if conditional ]

等价于:

for item in list:
    if conditional:
        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]这样做(在重新排列表达式后):

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

你可以将条件句移动到:

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的混淆(我认为在任何情况下都应避免使用l和O作为变量名,即使是在快速而肮脏的示例代码中)。