如果列表中的其他理解

时间:2010-12-10 06:45:52

标签: python list list-comprehension if-statement

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

8 个答案:

答案 0 :(得分:397)

>>> 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>做某事,否则做其他事情。

答案 1 :(得分:210)

您收到此错误的原因与列表推导的执行方式有关。

请记住以下内容:

[ 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

答案 2 :(得分:176)

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

为了奖励,这是评论,我写这篇文章是为了第一次记错:

  

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]

答案 3 :(得分:91)

你必须把表达式放在列表推导的开头,结尾的if语句过滤元素!

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

答案 4 :(得分:16)

您还可以将条件表达式放在列表解析中的括号中:

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

[false,true] [condition]是语法

答案 5 :(得分:14)

if($row["Valid"] == 1) 一样,[a if condition1 else b for i in list1 if condition2]if两个condition1做了两件不同的事情。部分condition2来自lambda表达式:

(a if condition1 else b)

而另一个lambda x: a if condition1 else b 是另一个lambda:

condition2

可以将整个列表理解视为lambda x: condition2 map的组合:

filter

答案 6 :(得分:8)

我遇到了类似的问题,发现这个问题并且答案非常有用。这是我感到困惑的部分。我明确地写了它,因为没有人用英语简单地说出来:

迭代结束了。

通常情况下,循环

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 ] 

答案 7 :(得分: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应该在任何情况下都应该作为变量名称避免,即使在快速而肮脏的示例代码中)。