尝试使用filter()查找列表中的所有素数

时间:2017-05-10 02:55:38

标签: python

所以我试图使用filter()来查找列表中的所有素数,但输出很奇怪。我被困在这一个上超过一个小时...仍然无法弄清楚我做错了什么

以下是代码:

TEST_LIST = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
RESULT_LIST = filter(
    lambda x: not [x % i == 0 for i in range(2, math.floor(x / 2))], TEST_LIST)
print(TEST_LIST)
print(list(RESULT_LIST))


Output:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5]

1 个答案:

答案 0 :(得分:1)

首先,您可能想要修复代码中的错误。您希望范围包含x / 2,否则您的算法会中断x = 4。在避免使用math模块的同时执行此操作的一种简单方法是使用截断除法,只需添加一个:x // 2 + 1

查看列表理解的结果:

In [6]: x = 36

In [7]: [x % i == 0 for i in range(2, x // 2 + 1))]
Out[7]:
[True,
 True,
 True,
 False,
 True,
 False,
 False,
 True,
 False,
 False,
 True,
 False,
 False,
 False,
 False,
 False]

请注意,无论x的值如何,列表都将始终为非空。非空列表是真实的,无论它们包含什么:

In [8]: bool([True])
Out[8]: True

In [9]: bool([False])
Out[9]: True

您想要检查列表中的任何是否真实:

In [10]: any([x % i == 0 for i in range(2, x // 2 + 1)])
Out[10]: True

如果您不使用列表解析而是使用生成器表达式,而不生成中间列表,则可以加快速度:

In [11]: any(x % i == 0 for i in range(2, x // 2 + 1))
Out[11]: True