我正在尝试创建一个包含小于或等于给定数字的所有素数的列表。我使用 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 值......所以你应该允许自己使用换行符而只使用普通循环。
