簡體   English   中英

嘗試使用filter()查找列表中的所有素數

[英]Trying to use filter() to find all prime numbers in a list

所以我試圖使用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]

首先,您可能要修復代碼中的錯誤。 您希望范圍包括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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM