不理解python中的列表理解

时间:2016-02-15 22:37:23

标签: python python-2.7

在做一些列表理解练习时,我不小心做了下面的代码。这最终打印出列表中所有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所以更多的解释更好:)谢谢!

5 个答案:

答案 0 :(得分:6)

你可能缺少的是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子句支持这一点,该子句接受表达式并将结果列表限制为布尔表达式返回true值的项。这就是你的第二个表达式正常工作的原因。

答案 1 :(得分:2)

在以下代码中:

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

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

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

希望这有帮助,并且开心FizzBu​​zzing

答案 2 :(得分:2)

在您的第一个代码示例中,您将使用

的值
x % 3 == 0 or x % 5 == 0

进入你的清单。当该表达式被评估为true或false时,您将在列表中得到布尔值。

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

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

编辑:根据@ user4815162342的评论修正了该集。

答案 3 :(得分:1)

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

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

因此,在您的第一次尝试中,您已将其列入列表

答案 4 :(得分:0)

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

  1. 项目将显示在最终列表中
  2. 项目来源
  3. 限制
  4. 您给出的第一个示例评估为布尔值(True / False)。 第二个是将x的放入列表中,并使用限制进行可分性。