Skip to main content
 首页 » 编程设计

python之使用列表理解生成素数列表

2025年05月04日12cyq1162

我正在尝试创建一个包含小于或等于给定数字的所有素数的列表。我使用 for 循环成功地做到了这一点。我试图通过使用 python 的列表理解来实现相同的目的。但是我的输出有一些意想不到的值。

这是我的代码..

pr=[2] 
pr+=[i for i in xrange(3,num+1) if not [x for x in pr if i%x==0]] 

其中 num 是我从用户输入的数字。

以上代码的输出为

num=20 is this:  [2, 3, 5, 7, 9, 11, 13, 15, 17, 19] 

我很困惑为什么输出中会有 9 和 15。我在这里做错了什么?

请您参考如下方法:

这根本行不通。列表理解是单独求值的,所以你可以这样想象:

pr = [2] 
tmp = [i for i in xrange(3,num+1) if not [x for x in pr if i%x==0]] 
pr += tmp 

在计算 tmp 时,pr 只包含 2,所以你只需要检查一个数字是否可以被 2 整除(即如果它是偶数)。这就是为什么你得到的都是奇数。

您根本无法使用列表理解很好地†解决这个问题。


† 不是很好,但很丑陋,而且以一种非常骇人听闻的方式,通过滥用你可以在列表推导中调用函数:

pr = [2] 
[pr.append(i) for i in xrange(3,num+1) if not [x for x in pr if i%x==0]] 
print(pr) # [2, 3, 5, 7, 11, 13, 17, 19] 

这会滥用列表推导式,基本上会为您添加到 pr 的每个素数收集一个 None 值。所以它本质上就像你的普通 for 循环,除了我们不必要地在列表中收集 None 值......所以你应该允许自己使用换行符而只使用普通循环。