在做一些列表理解练习时,我不小心做了下面的代码。这最终打印出列表中所有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所以更多的解释更好:)谢谢!
答案 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
希望这有帮助,并且开心FizzBuzzing
答案 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中允许的表达式语法。要获得列表理解,您需要......
您给出的第一个示例评估为布尔值(True / False)。 第二个是将x的值放入列表中,并使用限制进行可分性。