单行列表理解: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]
【讨论】:
为什么要在列表理解中打印?这将创建一个完整的列表None
s...以上是关于单行列表理解:if-else 变体的主要内容,如果未能解决你的问题,请参考以下文章
掌握这9个单行代码技巧!你也能写出『高端』Python代码 ⛵
Note on python__2021-07-05Python练习使用if-else条件选择+list列表——>age_selector