提问人:user225312 提问时间:12/10/2010 最后编辑:Dan D.user225312 更新时间:3/28/2023 访问量:1134953
if else in a list comprehension [复制]
if else in a list comprehension [duplicate]
问:
我有一个清单: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]
但它给了我一个语法错误。我怎样才能在列表理解中实现这样的 - ?if
else
答:
您必须将表达式放在列表推导的开头,末尾的 if 语句过滤元素!
[x+1 if x >= 45 else x+5 for x in l]
评论
['upper' if item.isupper() else 'lower' for item in 'Omg! paNCAkEs!!!' if item.isalpha()]
>>> 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>
评论
x
x
var_list = [v for v in tf.all_variables() if v.name == 'C:0']
[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]
评论
[x+1 if x >= 45 else (x-1 if x < 10 else x+5) for x in l]
for i in items if fC
a if tC else b
items
fC
if
A if C else B
if
i 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)
您可以将条件移动到:
v = [22, 13, 45, 50, 98, 69, 43, 44, 1]
[ (x+1 if x >=45 else x+5) for x in v ]
但它开始看起来有点丑陋,所以你最好使用一个普通的循环。请注意,我使用列表变量而不是 for 变量来减少与数字 1 的混淆(我认为并且在任何情况下都应该避免作为变量名称,即使在快速而肮脏的示例代码中也是如此)。v
l
l
O
出现此错误的原因与列表推导的执行方式有关。
请记住以下几点:
[ 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
评论
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()]
'link' in links.keys()
False
{'albums': links['link']}
[x+1 for x in l if x >= 45]
else
if
for
else
for
您还可以将条件表达式放在列表推导式内的括号中:
l = [22, 13, 45, 50, 98, 69, 43, 44, 1]
print [[x+5,x+1][x >= 45] for x in l]
[假,真][condition] 是语法
我只是遇到了类似的问题,发现这个问题和答案真的很有用。这是我感到困惑的部分。我明确地写它,因为没有人真正简单地用英语表达它:
迭代在最后进行。
通常,循环会进行
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 ]
就像在 中,两者 s 和 做两件不同的事情。该部分来自 lambda 表达式:[a if condition1 else b for i in list1 if condition2]
if
condition1
condition2
(a if condition1 else b)
lambda x: a if condition1 else b
而另一个是另一个 lambda:condition2
lambda x: condition2
整个列表的理解可以看作是 和 的组合:map
filter
map(lambda x: a if condition1 else b, filter(lambda x: condition2, list1))
评论
map
filter
[ 'hello' if x == 1 ]
评论