如果列表中的其他理解

use*_*312 398 python if-statement list-comprehension list

我有一个清单l:

l = [22, 13, 45, 50, 98, 69, 43, 44, 1]
Run Code Online (Sandbox Code Playgroud)

对于45以上的数字,我想加1; 对于小于它的数字,5.

我试过了

[x+1 for x in l if x >= 45 else x+5]
Run Code Online (Sandbox Code Playgroud)

但它给了我一个语法错误.我怎样才能实现if- else在列表理解这样吗?

use*_*312 446

>>> 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]
Run Code Online (Sandbox Code Playgroud)

做某事,如果<condition>,否则做其他事情.

  • 似乎条件也可以在最后例如提取具有特定条件的对象(本例中的名称)`var_list = [v for tf.all_variables()v如果v.name =='C:0'] ` (9认同)
  • 我发现,如果将条件放在开头,那么它需要if和else(它必须产生一个元素)-但是将它放在结尾,则仅需要if(您不能在其中放置else)。 (6认同)
  • 可能应该使用与"x"不同的变量作为底部解释中的条件,因为在示例中使用"x"而不是条件. (3认同)
  • 如果满足条件,仅将变量包括在列表中怎么办?否则会过去吗? (3认同)
  • @Jeppe正确,这是一个重要的区别。如果您只想保留某些元素(即:您不一定希望每次迭代都有一个数组条目),那么您需要将条件放在最后。 (2认同)

arb*_*oc7 226

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

请记住以下内容:

[ expression for item in list if conditional ]
Run Code Online (Sandbox Code Playgroud)

相当于:

for item in list:
    if conditional:
        expression
Run Code Online (Sandbox Code Playgroud)

其中expression格式略有不同(想想在一个句子中切换主语和动词顺序).

因此,您的代码[x+1 for x in l if x >= 45]执行此操作:

for x in l:
    if x >= 45:
        x+1
Run Code Online (Sandbox Code Playgroud)

但是,此代码[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
Run Code Online (Sandbox Code Playgroud)


Dan*_* D. 204

[x+1 if x >= 45 else x+5 for x in l]
Run Code Online (Sandbox Code Playgroud)

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

Python的条件表达式是a if C else b,不能用作:

[a for i in items if C else b]
Run Code Online (Sandbox Code Playgroud)

正确的形式是:

[a if C else b for i in items]
Run Code Online (Sandbox Code Playgroud)

即使有一个有效的表格:

[a for i in items if C]
Run Code Online (Sandbox Code Playgroud)

但这与您过滤的方式不同C,但它们可以合并:

[a if tC else b for i in items if fC]
Run Code Online (Sandbox Code Playgroud)


And*_*Dog 104

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

[x+1 if x >= 45 else x+5 for x in l]
Run Code Online (Sandbox Code Playgroud)

  • +1用于在理解开始时与结束时明确区分条件的作用.你也可以同时做两件事; 例如`''upper'如果item.isupper()则'低''为'Omg中的项目!薄煎饼!!!' if item.isalpha()]` (23认同)

Xia*_*hen 19

就像在[a if condition1 else b for i in list1 if condition2],两个ifs condition1condition2做两个不同的事情.该部分(a if condition1 else b)来自lambda表达式:

lambda x: a if condition1 else b
Run Code Online (Sandbox Code Playgroud)

而另一个condition2是另一个lambda:

lambda x: condition2
Run Code Online (Sandbox Code Playgroud)

整个列表可以看作组合mapfilter:

map(lambda x: a if condition1 else b, filter(lambda x: condition2, list1))
Run Code Online (Sandbox Code Playgroud)


Ste*_*ald 17

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

    l = [22, 13, 45, 50, 98, 69, 43, 44, 1]
    print [[x+5,x+1][x >= 45] for x in l]
Run Code Online (Sandbox Code Playgroud)

[false,true] [条件]是语法


sze*_*lin 11

我刚遇到类似的问题,发现这个问题和答案真的很有用.这是我感到困惑的部分.我是明确写的,因为没有人用英语简单地说出来:

迭代结束了.

通常,循环进行

for this many times:
    if conditional: 
        do this thing
    else:
        do something else  
Run Code Online (Sandbox Code Playgroud)

每个人都将列表理解部分简单地称为第一个答案,

[ expression for item in list if conditional ] 
Run Code Online (Sandbox Code Playgroud)

但这实际上不是你在这种情况下做的事情.(我试图这样做)

在这种情况下,它更像是这样的:

[ expression if conditional else other thing for this many times ] 
Run Code Online (Sandbox Code Playgroud)


Jee*_*eet 6

您可以将条件移动到:

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

但它开始看起来有点难看,所以你可能最好使用正常的循环.请注意,我用v的,而不是l为列表变量,以减少与数字1混淆(我想lO应该避免,因为在任何情况下变量名,即使在快速和肮脏的示例代码).