如何解决在列表理解中使用多个if else语句时,其他语句将被忽略
我的问题陈述是使用列表理解(条件如下)来创建数字在1到30之间的列表: 如果数字可被15整除,则列表应包含 a ;如果数字可被5整除,则列表应包含 b ;如果数字可被3整除,则列表应包含数字本身。
我 必须仅使用列表理解来实现它 ,因此请勿提出其他方法。
这是我最初的方法:
list=["a" if i%15 is 0
else "b" if i%5 is 0
else i if i%3 is 0
for i in range(1,31)
]
这会在上为给出语法错误。
所以我尝试了这个:
list=["a" if i%15 is 0
else "b" if i%5 is 0
else i
for i in range(1,31)
if i%3 is 0
]
[3,6,9,12,'a',18,21,24,27,"a"]
现在我不明白为什么在这里忽略else条件。我是python的新手,所以有人可以在这里解释我在哪里出错。就像 我 的其他阻止代码为我的问题陈述写的 not 一样,这等效于我的情况(我知道)。
我也不明白为什么会这样。
list=["a" if i%15 is 0
else "b" if i%5 is 0
else i
for i in range(1,31)
]
给出的输出显然不是我的问题陈述的正确选择,但我很好奇最后没有if条件如何使其正常工作。
解决方法
您的代码有几处可以改进的地方:
- 不要命名与内置函数冲突的变量
list
。 - 请勿使用
is
来比较数字,而应使用==
。 - 除非您将其提取到单独的函数中,否则不要对这么大的条件使用列表推导。
- 不要嵌套条件表达式,当您有很多条件时,最好使用
if-elif-else
。这可能是您问题的根源! - 您无法处理数字不能被15、5或3整除的情况。
这就是我的意思,请注意if
右侧的range
如何过滤我们要删除的所有值:
def test_value(i):
if i % 15 == 0:
return "a"
elif i % 5 == 0:
return "b"
else:
return i
lst = [test_value(i) for i in range(1,31) if i % 5 == 0 or i % 3 == 0]
如果您确实希望单行执行此操作,仍然可以,但是强烈建议不要这样做-您不应嵌套和滥用这样的条件表达式:
lst = ["a" if i % 15 == 0 else "b" if i % 5 == 0 else i for i in range(1,31) if i % 5 == 0 or i % 3 == 0]
它按预期工作:
lst
=> [3,'b',6,9,12,'a',18,21,24,27,'a']
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。