python 素数筛选

import itertools
a=(list(itertools.combinations([1,2,4,5,9,17,28,30
], 6)))
print(len(a))
print(a)
结果为28
[(1, 2, 4, 5, 9, 17), (1, 2, 4, 5, 9, 28), (1, 2, 4, 5, 9, 30), (1, 2, 4, 5, 17, 28), (1, 2, 4, 5, 17, 30), (1, 2, 4, 5, 28, 30), (1, 2, 4, 9, 17, 28), (1, 2, 4, 9, 17, 30), (1, 2, 4, 9, 28, 30), (1, 2, 4, 17, 28, 30), (1, 2, 5, 9, 17, 28), (1, 2, 5, 9, 17, 30), (1, 2, 5, 9, 28, 30), (1, 2, 5, 17, 28, 30), (1, 2, 9, 17, 28, 30), (1, 4, 5, 9, 17, 28), (1, 4, 5, 9, 17, 30), (1, 4, 5, 9, 28, 30), (1, 4, 5, 17, 28, 30), (1, 4, 9, 17, 28, 30), (1, 5, 9, 17, 28, 30), (2, 4, 5, 9, 17, 28), (2, 4, 5, 9, 17, 30), (2, 4, 5, 9, 28, 30), (2, 4, 5, 17, 28, 30), (2, 4, 9, 17, 28, 30), (2, 5, 9, 17, 28, 30), (4, 5, 9, 17, 28, 30)]

假设1也算质数(素数),其中一组(1, 2, 4, 5, 9, 28) 质数和合数比为3:3,一是怎么样排除掉有3个素数的组合,剩下其他的组合。二是同时排除3个素数和4个素数的组合


import itertools
su = [n for n in range(34) if len([v for v in range(2,n) if n % v == 0]) == 0] + [1]
a=[v for v in list(itertools.combinations([1,2,9,12,14,17,28,30], 6)) if len([n for n in v if n in su]) not in [3,4]]
print(len(a))
print(a)

推荐给你的推导式文章你没看么?

首先你要有一个判断质数的函数,用来判断单个数字是不是质数
其次你可以把其中的质数都挑出来:
质数: [1,2,4,5,17]
非质数: [4, 9, 28, 30]
这不是拿6个数吗?无非是
1个质数 + 5个非质数
2个质数 + 4个非质数
3个质数 + 3个非质数(这个不要)
4个质数 + 2个非质数
5个质数 + 1个非质数

挑出来后你再组合,要不然你的算法在数据大的时候会卡死。我们要实现只一个数只被判断一次是不是质数。