Python集合理解

所以我有一个家庭作业这两个问题,我被困在第二个。

  1. 使用Python Set Comprehension(Python的等价于Set Builder符号)生成一组小于100的所有素数。回想一下,质数是一个大于1的整数,不能被除整数以外的任何整数本身和1.将你的一组素数存储在一个variables(你将需要它的额外部分)。 输出素数集(例如,使用打印function)。

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

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

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

然而,我很难第二个。 我认为我可能不得不采取集合r的笛卡尔积,但是我不确定。

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

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

我简化了testing – if all(x%y而不是if not any(not x%y

我也限制了你的范围; testing除数> 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} 

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

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

设定理解背后的全部理念是让我们用代码来书写和推理,就像我们手工进行math一样。

有了恰当的谓词,问题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)} 

注意这个代码是如何直接翻译问题规范的:“主对是一对连续的双数都是主要的。

PS我试图给你正确的解决问题的技巧,而不是实际给出作业问题的答案。

你可以像这样产生对:

 {(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} 
    Interesting Posts