if else in a list comprehension [复制]

if else in a list comprehension [duplicate]

提问人:user225312 提问时间:12/10/2010 最后编辑:Dan D.user225312 更新时间:3/28/2023 访问量:1134953

问:

我有一个清单: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]

但它给了我一个语法错误。我怎样才能在列表理解中实现这样的 - ?ifelse

python 列表 list-comprehension if-语句

评论


答:

145赞 AndiDog 12/10/2010 #1

您必须将表达式放在列表推导的开头,末尾的 if 语句过滤元素!

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

评论

32赞 Air 10/15/2013
+1 用于明确区分条件词在理解开始时和结束时的作用。您也可以同时执行这两项操作;例如:['upper' if item.isupper() else 'lower' for item in 'Omg! paNCAkEs!!!' if item.isalpha()]
0赞 vinSan 8/26/2020
伟大!谢谢,如果出现其他情况,是否有其他选项
1赞 pfabri 1/11/2021
@vinSan 如果你想在列表推导中使用 elif,你可能已经超过了列表推导的复杂程度。把你的逻辑放在一个函数中,然后从你的列表推导中调用它。
795赞 user225312 12/10/2010 #2
>>> 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>

评论

3赞 tscizzle 4/18/2015
可能应该使用与底部解释中的条件不同的变量,因为在示例中用作条件而不是条件。xx
4赞 Charlie Parker 7/26/2016
如果满足条件,则仅在列表中包含变量怎么办?其他的会通过吗?
18赞 Charlie Parker 7/26/2016
似乎条件也可以放在最后,例如提取具有特定条件的对象(本例中的名称)var_list = [v for v in tf.all_variables() if v.name == 'C:0']
44赞 Jeppe 12/9/2018
我发现如果将条件放在开头,那么它需要 if 和 else(它必须产生一个元素)——但把它放在最后,只需要 if(你不能在那里放一个 else)。
3赞 Sam Creamer 8/30/2019
@Jeppe 正确,这是一个重要的区别。如果你只想保留某些元素(即:你不一定希望每次迭代都有一个数组的条目),那么你需要把条件放在最后。
304赞 Dan D. 12/10/2010 #3
[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]

评论

0赞 3kstc 6/2/2016
@Dan D.多块呢?即 ?我对 if 语句也有类似的问题if[x+1 if x >= 45 x-1 if x<10 else x+5 for x in l]
0赞 Dan D. 6/2/2016
@3kstc:为此:.我会看看你的问题。[x+1 if x >= 45 else (x-1 if x < 10 else x+5) for x in l]
0赞 Mushir 9/29/2016
@Dan D. 谢谢 正确的形式是:[a if C else b for i in items] 这对我有用。
0赞 Bowen Liu 11/29/2018
不是OP,但感谢您的回答。对于你的最后一行代码,你能为我解释一下吗?这是否意味着您只使用条件元素,可以实现?谢谢。for i in items if fCa if tC else bitemsfC
0赞 Dan D. 11/30/2018
@BowenLiu 是的。重点是显示 in 三元和 中的条件之间的区别。如果你说出结果,每个理解都可以写成语句。 成为。ifA if C else Bifi for i in items if p(i)v = [A if q(i) else B for i in L if p(i)]v = []for i in L: if p(i): v.append(A if q(i) else B)
6赞 Jeet 12/10/2010 #4

您可以将条件移动到:

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

但它开始看起来有点丑陋,所以你最好使用一个普通的循环。请注意,我使用列表变量而不是 for 变量来减少与数字 1 的混淆(我认为并且在任何情况下都应该避免作为变量名称,即使在快速而肮脏的示例代码中也是如此)。vllO

351赞 arboc7 12/10/2010 #5

出现此错误的原因与列表推导的执行方式有关。

请记住以下几点:

[ 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

评论

1赞 Shashank 10/13/2013
我的代码 user_albums = [{'albums': links['link']} for links in _details['albums']['data'] if 'link' in links.keys() else pass] in else condition in pass 错误
1赞 arboc7 10/18/2013
@shihon 不需要列表理解;这意味着在满足条件时,您不希望将该项目包含在列表中。正确格式:else pass{'albums': links['link']}if 'link' in links.keys()user_albums = [{'albums': links['link']} for links in _details['albums']['data'] if 'link' in links.keys()]
0赞 Shashank 10/18/2013
这意味着,如果数据不存在或 null,它会自己处理这个异常??
0赞 arboc7 10/20/2013
@shihon When 是 ,Python 列表推导会跳过要添加到列表中的表达式。您扩展的代码的行为方式与我上面的答案相同。'link' in links.keys()False{'albums': links['link']}[x+1 for x in l if x >= 45]
0赞 Mauro 7/28/2023
因此,如果语句中有 ,则 goes 在最后,但如果在初始表达式之后没有 goes?elseifforelsefor
22赞 Stefan Gruenwald 7/4/2014 #6

您还可以将条件表达式放在列表推导式内的括号中:

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

[假,真][condition] 是语法

17赞 szeitlin 2/19/2015 #7

我只是遇到了类似的问题,发现这个问题和答案真的很有用。这是我感到困惑的部分。我明确地写它,因为没有人真正简单地用英语表达它:

迭代在最后进行。

通常,循环会进行

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 ] 
41赞 Xiaojun Chen 2/2/2016 #8

就像在 中,两者 s 和 做两件不同的事情。该部分来自 lambda 表达式:[a if condition1 else b for i in list1 if condition2]ifcondition1condition2(a if condition1 else b)

lambda x: a if condition1 else b

而另一个是另一个 lambda:condition2

lambda x: condition2

整个列表的理解可以看作是 和 的组合:mapfilter

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

评论

0赞 Drake Guan 6/6/2021
与两个条件片段的映射非常好。mapfilter
1赞 y_159 6/20/2022
我们可以在没有 for 循环的情况下进行列表推导,并且只在 if/else 中放置一个默认值,并在需要时扩展它吗?即结果 = .这给出了语法错误。[ 'hello' if x == 1 ]