【问题标题】:Else statement gets ignored when using multiple if else statements in list comprehension在列表理解中使用多个 if else 语句时,Else 语句被忽略
【发布时间】:2020-09-10 12:41:57
【问题描述】:

我的问题陈述是使用列表推导式创建一个数字在 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 比较陌生,所以有人可以解释一下我在哪里犯了错误。就像 为我的问题陈述写的 not 正确的代码(我知道),如果 else 块代码是等价的。

我也不明白为什么会这样。

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

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

【问题讨论】:

  • 不要使用is比较数字
  • 当您在推导式中将if i%3 is 0 放在for 之后时,这意味着任何与该谓词不匹配的项目都将被完全排除在列表之外。
  • 预期输出是什么?
  • 如果数字不能被 15、5 或 3 整除,应该返回什么?
  • @HarshaBiyani 输出应该是 [3,'b',6,9,'b',12,'a',18,'b',21,24,'b', 27,'a']

标签: python list if-statement list-comprehension


【解决方案1】:

您的代码可以改进以下几点:

  • 不要将变量命名为 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.我已经更改了变量名。 2. 我用'is'是因为我的老师说这是推荐的方法。我会仔细看看的。 3. 就像我提到的,我们必须使用 List Comprehension。
  • 在Python中你不能使用is来比较数字,你的老师错了。
  • 就像旁注一样,它用于比较身份,如果 a 和 b 是同一个对象,则 a 为 b 为真,它用于检查无,因为 a 为无,因为 None 是一个全局对象
  • 预期输出是什么?如果数字不能被 15、5 或 3 整除,应该返回什么?
  • 如果这些条件都不成立,则不应将任何内容添加到列表中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多