【问题标题】:Not comprehending list comprehension in python不理解python中的列表理解
【发布时间】:2016-02-15 22:37:23
【问题描述】:

在做一些列表理解练习时,我不小心做了下面的代码。这最终为列表中的所有 16 个条目打印 True/False。

threes_and_fives =[x % 3 == 0 or x % 5 == 0 for x in range(16)]
print threes_and_fives

在我玩过它之后,我得到了我想要的结果,它打印了该列表中可以被 3 或 5 整除的数字。

threes_and_fives =[x for x in range(16) if x % 3 == 0 or x % 5 == 0]
print threes_and_fives

我的问题是为什么第一个代码评估为真或假而另一个没有?我正在尝试掌握python,所以解释越多越好:)谢谢!

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    您可能缺少的是 Python 中的关系运算符并没有什么特别之处,它们是 表达式 和其他任何表达式一样,碰巧产生布尔值。举几个例子:

    >>> 1 + 1 == 2
    True
    >>> 2 + 2 == 5
    False
    >>> [1 + 1 == 2, 2 + 2 == 5]
    [True, False]
    

    列表推导式只是将涉及可迭代序列元素的表达式收集到列表中:

    >>> [x for x in xrange(5)]      # numbers 0 through 4
    [0, 1, 2, 3, 4]
    >>> [x**2 for x in xrange(5)]   # squares of 0 through 4
    [0, 1, 4, 9, 16]
    

    你的第一个表达式就是这样工作的,但是表达式产生布尔值:它告诉 Python 组装一个布尔值列表,对应于匹配的序数是否可以被 3 或 5 整除。

    你真正想要的是一个由指定条件过滤的数字列表。 Python 列表推导通过可选的if 子句支持这一点,该子句接受一个表达式并将结果列表限制为布尔表达式返回真值的那些项目。这就是为什么您的第二个表达式可以正常工作的原因。

    【讨论】:

    • 谢谢!这是有道理的,我真的很感激这个网站有多棒!好答案
    • @noob2014:如果这是您认为的最佳答案,您应该接受。 :)
    • 我只是选中那个框吗?
    • 是的。如您所见,答案现在有一个绿色勾号,表示它已被接受。
    【解决方案2】:

    在以下代码中:

    [x % 3 == 0 or x % 5 == 0 for x in range(16)]
    

    列表解析为range(16) 中的每个值返回x % 3 == 0 or x % 5 == 0 的结果,这是一个布尔值。例如,如果您将x 设置为等于0,您可以看到循环的每次迭代都发生了什么:

    x = 0
    x % 3 == 0 or x % 5 == 0
    # True
    

    希望这会有所帮助,并祝 FizzBu​​zzing 快乐

    【讨论】:

      【解决方案3】:

      在您的第一个代码示例中,您将值设为

      x % 3 == 0 or x % 5 == 0
      

      进入您的列表。由于该表达式被评估为真或假,因此您最终会在列表中得到布尔值。

      在第二个示例中,您的条件是在列表中包含 x 的条件,因此您将获得可被 3 或 5 整除的数字列表。因此,列表理解语句必须读作

      从集合 {0,1,...,15} 中包含值 x,其中条件 (x 可被 3 或 5 整除) em> 满足了。

      编辑:根据@user4815162342 的评论修复了设置。

      【讨论】:

      • nitpick:集合是 {0, 1, ..., 15}
      【解决方案4】:

      以下行是返回 True 或 False 的条件:

      x % 3 == 0 or x % 5 == 0
      

      所以在您第一次尝试时,您已将其放入列表中

      【讨论】:

        【解决方案5】:

        这只是 Python 中允许的表达式语法。对于列表理解,您需要...

        1. 要出现在最终列表中的项目
        2. 物品来源
        3. 限制

        您给出的第一个示例评估为布尔值(真/假)。 第二个说将x的放入列表中,具有可除性的限制

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-12-03
          • 1970-01-01
          • 2014-08-26
          • 1970-01-01
          • 1970-01-01
          • 2011-08-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多