如何使用Python列表推导式生成2至100的所有小于100的倍数(构建非质数集合)
解决方法:用列表推导式生成1-100的非质数列表
首先得说,你当前的代码逻辑完全偏离了预期目标——内层的[x+x for x in range(100) if i + i <= 100]只是在生成一堆偶数,然后用这个非空列表作为判断条件,导致只要i <=50就会被塞进结果里,这和你要遍历每个数的倍数的需求根本不沾边。
接下来咱们用正确的列表推导式实现你的需求。先明确核心:非质数包括数字1和所有合数,而合数是除了1和自身外还有其他因数的数,也就是可以表示为n*k(n>=2,k>=2,且n*k <=99)的数。
生成所有合数的列表推导式
composites = [n * k for n in range(2, 100) for k in range(2, 100 // n + 1)]
这个推导式的逻辑很清晰:
- 外层循环遍历每个可能的底数
n(从2到99) - 内层循环遍历倍数系数
k(从2开始,直到n*k不超过99,也就是k最大为99//n) - 每次计算
n*k并加入列表,得到的就是2-99之间的所有合数
得到完整的非质数列表
因为非质数还包含数字1,直接把它加进去就行:
non_primes = [1] + composites
如果一定要严格按照你最初的步骤(把每个数的所有小于100的倍数,包括自身,加入列表),推导式会是这样:
all_multiples = [n * k for n in range(2, 100) for k in range(1, 100 // n + 1)]
但要注意,这个列表里会包含所有质数(比如3会因为n=3,k=1被加入),不过这刚好适配你后续用埃拉托斯特尼筛法的需求——筛法本身就是通过标记倍数来筛选质数,只要是1或者不在这个列表里的数(且>=2)就是质数。
内容的提问来源于stack exchange,提问作者user15464781
相关产品推荐
相关产品推荐

