在列表理解中使用多个 if else 语句时,Else 语句被忽略

Else statement gets ignored when using multiple if else statements in list comprehension

我的问题陈述是使用列表理解创建一个包含 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)
]

这在 for 处给出 语法错误

所以我尝试了这个:

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
    ]

但这最终忽略了第一个 else 条件并给出了以下输出。

[3,6,9,12,'a',18,21,24,27,"a"]

现在我不明白为什么这里忽略了 else 条件。我对 python 比较陌生,所以有人可以解释一下我在哪里犯了错误。就像 I 写的 not 的正确块代码一样我的问题陈述(我知道)。

我也不明白为什么这行得通。

list=["a" if i%15 is 0
    else "b" if i%5 is 0
    else i
    for i in range(1,31)
    ]

这给出的输出显然不是我的问题陈述的正确输出,但我很好奇最后没有 if 条件如何使它正常工作。

您的代码有几处可以改进:

  • 不要命名与 built-in 函数冲突的变量 list
  • 不要使用 is 比较数字,使用 ==
  • 不要对如此大的条件使用列表理解,除非您将其提取到单独的函数中。
  • 不要嵌套条件表达式,当你有很多条件时更喜欢if-elif-else。这可能是您问题的根源!
  • 您没有处理数字不能被 15、5 或 3 整除的情况。

这就是我的意思,注意 range 右边的 if 是如何过滤我们要删除的所有值的:

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, 'b', 12, 'a', 18, 'b', 21, 24, 'b', 27, 'a']