Python集合理解
所以我有一个家庭作业这两个问题,我被困在第二个。
-
使用Python Set Comprehension(Python的等价于Set Builder符号)生成一组小于100的所有素数。回想一下,质数是一个大于1的整数,不能被除整数以外的任何整数本身和1.将你的一组素数存储在一个variables(你将需要它的额外部分)。 输出素数集(例如,使用打印function)。
-
使用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}