给定一个列表xs:
xs
xs = [22, 13, 45, 50, 98, 69, 43, 44, 1]
大于45的,加1;对于小于45的数,加5。
将表达式放在列表推导式的开头。if语句用于过滤元素!
[x+1 if x >= 45 else x+5 for x in xs]
>>> xs = [22, 13, 45, 50, 98, 69, 43, 44, 1] >>> [x+1 if x >= 45 else x+5 for x in xs] [27, 18, 46, 51, 99, 70, 48, 49, 6]
如果是<condition>就做点什么,否则就做点别的。
<condition>
作为奖励,下面是评论,我写的是为了记住我第一次犯这个错误:
Python的条件表达式是a if C else b,不能用作: [a for i in items if C else b] 正确的形式是: [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]
Python的条件表达式是a if C else b,不能用作:
a if C else b
[a for i in items if C else b]
正确的形式是:
[a if C else b for i in items]
即使有一个有效的表单:
[a for i in items if C]
但这与你通过C筛选的方式不一样,但它们可以组合在一起:
C
[a if tC else b for i in items if fC]
你可以将条件句移动到:
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作为变量名,即使是在快速而肮脏的示例代码中)。
v
l
O
得到这个错误的原因与列表推导的执行方式有关。
请记住以下几点:
[ expression for item in list if conditional ]
等价于:
for item in list: if conditional: expression
expression的格式略有不同(可以考虑在句子中切换主语和动词的顺序)。
expression
因此,你的代码[x+1 for x in l if x >= 45]这样做:
[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之后):
[x+1 if x >= 45 else x+5 for x in l]
for x in l: if x>=45: x+1 else: x+5
你也可以把条件表达式放在括号内的列表理解:
l = [22, 13, 45, 50, 98, 69, 43, 44, 1] print [[x+5,x+1][x >= 45] for x in l]
[false,true][condition]是语法
我也遇到过类似的问题,发现这个问题和答案真的很有用。这是我困惑的地方。我把它写得很明确,因为没有人用英语简单地说明:
# EYZ0
通常情况下,会有一个循环
for this many times: if conditional: do this thing else: do something else
每个人都像第一个答案一样简单地陈述了列表理解部分,
但实际上在这种情况下不是这样做的。(我就是这么想的)
在这种情况下,它更像是这样:
[ expression if conditional else other thing for this many times ]
就像在[a if condition1 else b for i in list1 if condition2]中,两个# eyz1与condition1和condition2做了两件不同的事情。部分(a if condition1 else b)来自lambda表达式:
[a if condition1 else b for i in list1 if condition2]
condition1
condition2
(a if condition1 else b)
lambda x: a if condition1 else b
而另一个condition2是另一个lambda:
lambda x: condition2
整个列表理解可以看作是map和filter的组合:
map
filter
map(lambda x: a if condition1 else b, filter(lambda x: condition2, list1))