在列表理解中使用多个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']