所以我试图使用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]
答案 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