2014-02-14 48 views
39

所以我有一个家庭作业这两个问题,我卡在第二个。Python Set Comprehension

  1. 使用Python的集理解(Python的等价集生成符号),以生成一组的所有质数小于100召回的是一个素数是一个整数,大于1不能被除本身以外的任何整数整除,1.将一组素数存储在一个变量中(您将需要它用于其他部分)。输出素数集(例如,使用打印功能)。

  2. 使用Python Set Comprehension生成一组有序对(长度为2的元组),由所有由小于100的素数组成的素数对组成。主对是一对连续的奇数,它们都是主要。将您的一组Prime对存储在一个变量中。您的号码1将非常有帮助。输出你的一组Prime对。

对于第一个,这个完美的作品:

r= {x for x in range(2, 101) 
if not any(x % y == 0 for y in range(2, x))} 

不过,我敢难倒第二个。我认为我可能不得不把某个r的Cartesian产品带上某个东西,但我不确定。

这让我有点接近,但我只想连续配对。

cart = { (x, y) for x in r for y in r 
    if x < y } 

回答

32
primes = {x for x in range(2, 101) if all(x%y for y in range(2, min(x, 11)))} 

我简化测试中的位 - 的if all(x%y代替if not any(not x%y

我也限制ÿ的范围;测试除数> sqrt(x)没有意义。因此max(x)== 100意味着max(y)== 10.对于x < = 10,y必须也是< x。

pairs = {(x, x+2) for x in primes if x+2 in primes} 

不是生成素数对并对它们进行测试,而是得到一个并查看相应的较高素数是否存在。

2

您可以生成对这样的:

{(x, x + 2) for x in r if x + 2 in r} 

然后所有剩下要做的就是获得一个条件,使他们风华正茂,你已经在第一个例子已经完成。

做它的一个不同的方法:(虽然慢大集的素数)

{(x, y) for x in r for y in r if x + 2 == y} 
+2

我不知道为什么你的更好的方法比较好。 OP已经有''r'中的素数小于100,因此如果r中的x + 2满足,则{{(x,x + 2) – DSM

+1

你是对的,我误解了他的代码。谢谢。 – icedtrees

+1

'和x%2 == 1'没有必要。 – thefourtheye

9

通过将适当的谓词构建为辅助函数,您可以获得清晰明了的解决方案。换句话说,使用Python设置生成器符号的方式与使用常规数学集合符号编写答案的方式相同。

集合理解背后的全部想法是让我们用代码来书写和推理,就像我们手工进行数学一样。

在掌握适当的谓词,问题1简化为:

low_primes = {x for x in range(1, 100) if is_prime(x)} 

而且问题2简化为:

low_prime_pairs = {(x, x+2) for x in range(1,100,2) if is_prime(x) and is_prime(x+2)} 

注意此代码是怎么问题说明的直接翻译,“ Prime对是一对连续的奇数,都是素数。“

P.S.我试图给你正确的解决问题的技巧,但实际上并没有给出作业问题的答案。

+1

虽然问题2可以简化为仅循环结果问题1,如说明中所示。 – tripleee