如果列表推导中有其他内容[重复]
- 2025-01-03 14:19:00
- admin 原创
- 216
问题描述:
我有一个清单l
:
l = [22, 13, 45, 50, 98, 69, 43, 44, 1]
对于 45 以上的数字(含),我想加 1;对于小于 45 的数字,我想加 5。
我试过
[x+1 for x in l if x >= 45 else x+5]
但它给出了语法错误。如何在列表推导中实现这样的if
– ?else
解决方案 1:
>>> 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>
,否则做其他事。
解决方案 2:
出现此错误的原因与列表理解的执行方式有关。
请记住以下几点:
[ 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
解决方案 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]
解决方案 4:
您必须将表达式放在列表推导的开头,末尾的 if 语句过滤元素!
[x+1 if x >= 45 else x+5 for x in l]
解决方案 5:
就像在 中一样,[a if condition1 else b for i in list1 if condition2]
两个if
和做两件不同的事情。这部分来自 lambda 表达式:condition1
`condition2`(a if condition1 else b)
lambda x: a if condition1 else b
而另一个condition2
是另一个 lambda:
lambda x: condition2
整个列表理解可以看作是map
和的组合filter
:
map(lambda x: a if condition1 else b, filter(lambda x: condition2, list1))
解决方案 6:
您还可以将条件表达式放在列表推导中的括号中:
l = [22, 13, 45, 50, 98, 69, 43, 44, 1]
print [[x+5,x+1][x >= 45] for x in l]
false,true 是语法
解决方案 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 ]
解决方案 8:
您可以将条件移动到:
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 的混淆(我认为l
和O
在任何情况下都应避免用作变量名,即使在快速而粗糙的示例代码中也是如此)。