单行列表理解:if-else 变体

Posted

技术标签:

【中文标题】单行列表理解:if-else 变体【英文标题】:One-line list comprehension: if-else variants 【发布时间】:2013-06-23 15:43:32 【问题描述】:

更多的是关于 python 列表理解语法。我有一个列表理解,可以生成给定范围的奇数列表:

[x for x in range(1, 10) if x % 2]

这构成了一个过滤器 - 我有一个源列表,其中我删除了偶数 (if x % 2)。我想在这里使用 if-then-else 之类的东西。以下代码失败:

>>> [x for x in range(1, 10) if x % 2 else x * 100]
  File "<stdin>", line 1
    [x for x in range(1, 10) if x % 2 else x * 100]
                                         ^
SyntaxError: invalid syntax

有一个类似if-else的python表达式:

1 if 0 is 0 else 3

如何在列表推导中使用它?

【问题讨论】:

看它的价值,你有一个“列表理解”,而不是一个生成器。最终语法是相同的,只是生成器使用() 而不是[] Is it possible to use 'else' in a python list comprehension?的可能重复 我花了一段时间才明白为什么if x % 2 消除偶数(而不是保留它们)——这是因为x 甚至是x % 2 表达式结果为0,其结果为False,而除0 之外的任何int 的结果为True 【参考方案1】:

x if y else z 是您为每个元素返回的表达式的语法。因此你需要:

[ x if x%2 else x*100 for x in range(1, 10) ]

混淆是因为您在第一个示例中使用了 过滤器,但在第二个示例中没有。在第二个示例中,您只是使用三元运算符表达式将每个值映射到另一个值。

使用过滤器,您需要:

[ EXP for x in seq if COND ]

没有你需要的过滤器:

[ EXP for x in seq ]

在您的第二个示例中,表达式是一个“复杂”的表达式,恰好涉及if-else

【讨论】:

我有一个问题...[x for x in range(1, 10) if x % 2] 是正确的语法。 [x if x % 2 for x in range(1, 10)] - 这不是,但[x if x%2 else x*100 for x in range(1, 10)] 又是正确的语法。怎么会? @tkoomzaaskz 在第二个示例中,这既不是三元 if-else 运算符(缺少 else),也不是过滤器(因为它位于列表理解的 EXP 部分) @tkoomzaaskz 为了进一步澄清,请注意您可以在末尾添加第二个if[x if x%2 else x*100 for x in range(1, 10) if not x%3] 第一个if 是三元运算符的一部分,第二个if 是一部分列表理解语法。整个x if x%2 else x*100 与简单的2*x“处于同一水平”,它是for 左侧的表达式,此时if not x%3 的过滤已经发生。 你好,单行语句会比在for i in x: 这样的两行然后在for循环中if i == y: 更高效吗?【参考方案2】:
[x if x % 2 else x * 100 for x in range(1, 10) ]

【讨论】:

【参考方案3】:

只是另一种解决方案,希望有人会喜欢它:

使用:[假,真][表达式]

>>> map(lambda x: [x*100, x][x % 2 != 0], range(1,10))
[1, 200, 3, 400, 5, 600, 7, 800, 9]
>>>

【讨论】:

【参考方案4】:

您也可以通过列表理解来做到这一点:

A=[[x*100, x][x % 2 != 0] for x in range(1,11)]
print A

【讨论】:

非常好。一个布尔切片。谢谢你给了我一个更容易阅读的解决方案。 您也可以像这样进行双重分配:A,B = [10,11][a==19],[1,14][a==20]【参考方案5】:

我能够做到这一点

>>> [x if x % 2 != 0 else x * 100 for x in range(1,10)]
    [1, 200, 3, 400, 5, 600, 7, 800, 9]
>>>

【讨论】:

【参考方案6】:

#如何排列一个负值和正值数组的列表

my_list=[-2,-3,0,1,5]
squred_values=[]
  

squred_values=[-i**2 if i<0 else i**2 for i in my_list]

#或

for i in my_list:
    if i<0:
        squred_values.append( -i**2)`enter code here`
    else:
        squred_values.append( i**2) 

【讨论】:

【参考方案7】:

二合一列表理解

ex = [['obi', 'is', '#alive'],['oge', 'is', 'beautiful'],
                ['Ade', 'the', '#comedian', 'de', '#rich'],['Jesus', 'wept']]
[print(j) if j.startswith("#") else print("_"+j) for i in ex for j in i]

【讨论】:

为什么要在列表理解中打印?这将创建一个完整的列表 Nones...

以上是关于单行列表理解:if-else 变体的主要内容,如果未能解决你的问题,请参考以下文章

python列表推导式中使用if-else

掌握这9个单行代码技巧!你也能写出『高端』Python代码 ⛵

If-Else List Perrehension

Note on python__2021-07-05Python练习使用if-else条件选择+list列表——>age_selector

Vue-if 条件不起作用。 if-Else 块似乎被跳过

20个简洁的 JS 代码片段