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>,否则做其他事情.
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,不能用作:Run Code Online (Sandbox Code Playgroud)[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]但这与您过滤的方式不同
C,但它们可以合并:Run Code Online (Sandbox Code Playgroud)[a if tC else b for i in items if fC]
And*_*Dog 104
您必须将表达式放在列表推导的开头,结尾处的if语句过滤元素!
[x+1 if x >= 45 else x+5 for x in l]
Run Code Online (Sandbox Code Playgroud)
Xia*_*hen 19
就像在[a if condition1 else b for i in list1 if condition2],两个ifs condition1和condition2做两个不同的事情.该部分(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)
整个列表可以看作组合map和filter:
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)
您可以将条件移动到:
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混淆(我想l和O应该避免,因为在任何情况下变量名,即使在快速和肮脏的示例代码).
| 归档时间: |
|
| 查看次数: |
459991 次 |
| 最近记录: |