不理解python中的列表理解

noo*_*014 1 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
Run Code Online (Sandbox Code Playgroud)

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

threes_and_fives =[x for x in range(16) if x % 3 == 0 or x % 5 == 0]
print threes_and_fives
Run Code Online (Sandbox Code Playgroud)

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

use*_*342 6

您可能缺少的是Python中的关系运算符没有什么特别之处,它们就像任何其他表达式一样,恰好产生布尔值.举一些例子:

>>> 1 + 1 == 2
True
>>> 2 + 2 == 5
False
>>> [1 + 1 == 2, 2 + 2 == 5]
[True, False]
Run Code Online (Sandbox Code Playgroud)

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

>>> [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]
Run Code Online (Sandbox Code Playgroud)

你的第一个表达式就是这样,但是使用表达式生成布尔值:它告诉Python汇编一个布尔值列表,对应于匹配的序号是否可以被3或5整除.

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