我有一个列表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
– else
?
我有一个列表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
– else
?
>>> 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>
,否则做,别的东西。
[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]
你可以移动有条件的:
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
在任何情况下都应该作为变量名避免,即使在快速肮脏的示例代码中也是如此)。
你得到这个错误的原因与列表理解的执行方式有关。
请记住以下几点:
[ 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
你也可以把条件表达式中括号内列表理解:
l = [22, 13, 45, 50, 98, 69, 43, 44, 1]
print [[x+5,x+1][x >= 45] for x in l]
[false,true] [condition]是语法
我刚刚有一个类似的问题,发现这个问题和答案真的很有用。这是我感到困惑的部分。我明确地写了它,因为没有人真正用英文表示它:
迭代结束。
通常情况下,一个循环将
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的condition1
和condition2
做两件不同的事情。部分(a if condition1 else b)
是从一个lambda表达式:
lambda x: a if condition1 else b
而另一condition2
是另一个lambda:
lambda x: condition2
所有列表解析可以看作的map
和filter
组合:
map(lambda x: a if condition1 else b, filter(lambda x: condition2, list1))
可能应该在底部的解释中使用与`x`不同的变量作为条件,因为在本例中不使用`x`作为条件。 – tscizzle 2015-04-17 20:03:37
如果条件满足,那么只有在列表中包含变量才可以呢?其他的只是通过? – 2016-07-25 16:38:57