Python列表理解(Euler项目5)

时间:2013-06-28 23:11:33

标签: python list

x = False
divisors = [2,3,4,5,6,7,8,9,10]
for i in range (10,10000,10):
    if [x for x in divisors if i % x == 0]:
        print(i)
        break

我可以获得一些有关此程序打印10的原因吗?它应该打印.. 2520

我现在花了很多时间在这个问题上,我想我并不真正理解列表理解,它是如何工作的,它返回的是什么。

如果任何的分裂产生浮动,我希望if句子会产生错误。

我需要使用铸造吗?

我是否在该范围内(10,10000,10)给出了10,20,30,40 ......,10000的列表?

2 个答案:

答案 0 :(得分:4)

尝试将其更改为以下内容:

divisors = [2,3,4,5,6,7,8,9,10]
for i in range (10,10000,10):
    if all(i % x == 0 for x in divisors):
         print(i)
         break

当前版本中的列表理解将始终包含最后3个值,因为10的每个倍数都可以被2,5和10整除。非空列表在布尔上下文中的计算结果为true,因此你将在第一次迭代时输入if块。

内置函数all()接受一个iterable并仅在每个元素为真时返回True(或在布尔上下文中计算为true)。因此,它非常适合确定i是否可以被divisors中的所有值整除。

答案 1 :(得分:3)

让我们分解一下。首先,

x = False

除了使代码混乱外什么都不做。不要使用它。接下来:

for i in range (10,10000,10):

在不查看项目的情况下,请注意range()会产生小于的所有值,因此它将以9990结束。如果这是您想要的,那很好 - 只需要注意它的。

最后:

    if [x for x in divisors if i % x == 0]:

读作“创建divisors中所有数字的列表,均匀分配到i”,然后“如果我刚刚创建的列表不为空,那么......”。因此,当i == 10时,该列表的评估结果为[2, 5, 10]。这不是一个空列表,因此评估为True并且if块运行。