【问题标题】:Multiple if statements in list comprehension with one iterator使用一个迭代器的列表理解中的多个 if 语句
【发布时间】:2023-02-17 22:03:31
【问题描述】:

我正在研究列表理解并遇到了添加几个条件的可能性。我不知道我期望的行为是什么,但我无法解释我得到的是什么。为什么1变成3,2还是2,3变成6?

a = [x if x % 2 == 0 else x * 2 if x % 3 == 0 else x * 3 for x in range(1, 11)]

输出:

[3, 2, 6, 4, 15, 6, 21, 8, 18, 10]

【问题讨论】:

  • 你至少应该尝试解释代码你写了.
  • 由于 Python 的三元是 <done if True> if <condition> else <done if False> 的形状,如果转换成 C 风格的三元会更容易阅读:x % 2 == 0 ? x : (x % 3 == 0 ? x * 2 : x * 3),其中三元的形状是 <condition> ? <done if True> : <done if False>(加上大括号)。
  • 这相当于[x if x % 2 == 0 else (x * 2 if x % 3 == 0 else (x * 3)) for x in range(1, 11)]。这有帮助吗?
  • 请注意,这与其说是列表理解中使用的“标准”条件(过滤输入,因此输出往往包含更少的元素),不如说是嵌套的三元条件。这个例子也可以在列表理解之外使用。
  • 这也属于以下类别:不要这样做,除非您试图参加混淆的 Python 竞赛(为此它的参赛成绩很差,但仍然如此)。

标签: python list-comprehension


【解决方案1】:

重写为一个循环可能有助于解释它:

a = []
for x in range(1, 11):
    if x % 2 == 0:
        temp = x
    elif x % 3 == 0:
        temp = x * 2
    else:
        temp = x * 3
    a.append(temp)

【讨论】:

    【解决方案2】:

    对于 1,它是这样的:

    1 % 2 = 1,所以它转到else 条款,

    1 % 3 = 1,所以它也转到else 子句

    它进入x*3这是1*3 = 3

    当你写x if condition else y时,只有当条件为真时你才会得到x。因此,由于条件为假,您转到 else 子句。你可以这样看:

    x if x % 2 == 0 else (x * 2 if x % 3 == 0 else x * 3) for x in range(1, 11)
    

    【讨论】:

      猜你喜欢
      • 2016-07-24
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      • 2011-08-22
      • 1970-01-01
      相关资源
      最近更新 更多