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