使用列表推导生成素数列表

ndh*_*ndh 1 python

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

这是我的代码。

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

num我从用户那里输入的号码在哪里?

上面代码的输出为

num=20 is this:  [2, 3, 5, 7, 9, 11, 13, 15, 17, 19]
Run Code Online (Sandbox Code Playgroud)

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

pok*_*oke 5

这样根本行不通。列表推导是单独评估的,因此可以像这样想象:

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

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]
Run Code Online (Sandbox Code Playgroud)

这会滥用列表理解力,并且基本上会None为您添加到的每个素数收集一个值pr。因此,除了我们不必要地None在列表中收集值外,它本质上与您的常规for循环类似,因此您应该允许自己使用换行符而仅使用常规循环。