Python集合理解

use*_*790 69 python set set-comprehension

所以我在家庭作业中遇到了这两个问题而且我被困在第二个问题上.

  1. 使用Python集合理解(Python相当于Set Builder表示法)生成一组小于100的所有素数.回想一个素数是一个大于1的整数,不能被除整数以外的任何整数整除.本身和1.将您的素数集存储在变量中(您将需要它用于其他部分).输出您的素数组(例如,使用打印功能).

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

对于第一个,这完美地工作:

r= {x for x in range(2, 101) 
if not any(x % y == 0 for y in range(2, x))} 
Run Code Online (Sandbox Code Playgroud)

但是,我对第二个问题很难过.我想我可能不得不采取一些东西的笛卡尔积,但我只是不确定.

这让我有点接近,但我只想要连续对.

cart = { (x, y) for x in r for y in r
     if x < y }
Run Code Online (Sandbox Code Playgroud)

Hug*_*ell 57

primes = {x for x in range(2, 101) if all(x%y for y in range(2, min(x, 11)))}
Run Code Online (Sandbox Code Playgroud)

我简化了测试 - if all(x%y而不是if not any(not x%y

我也限制了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}
Run Code Online (Sandbox Code Playgroud)

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


Ray*_*ger 13

通过将适当的谓词构建为辅助函数,您可以获得干净清晰的解决方案.换句话说,使用Python集合构建器表示法与使用常规数学集合表示法编写答案的方式相同.

集合理解背后的整个想法是让我们用与手工数学相同的方式在代码中编写和推理.

有了适当的谓词,问题1简化为:

 low_primes = {x for x in range(1, 100) if is_prime(x)}
Run Code Online (Sandbox Code Playgroud)

问题2简化为:

 low_prime_pairs = {(x, x+2) for x in range(1,100,2) if is_prime(x) and is_prime(x+2)}
Run Code Online (Sandbox Code Playgroud)

注意这段代码是如何直接翻译问题规范的,"素数对是一对连续的奇数都是素数."

PS我试图给你正确的问题解决技术,而不是实际上给出了家庭作业问题的答案.

  • 虽然问题2可以简化为仅仅循环结果frim问题1,如说明书中暗示的那样. (2认同)

ice*_*ees 5

您可以像这样生成对:

{(x, x + 2) for x in r if x + 2 in r}
Run Code Online (Sandbox Code Playgroud)

然后剩下要做的就是获得一个条件,使它们成为质数,这在第一个示例中已经完成。

一种不同的方法:(虽然对于大型素数集较慢)

{(x, y) for x in r for y in r if x + 2 == y}
Run Code Online (Sandbox Code Playgroud)

  • 我不确定为什么你的更好的方法更好。OP 在 `r` 中已经有小于 100 的素数,所以 `{(x, x + 2) for x in r if x + 2 in r}` 就足够了。 (3认同)
  • `and x % 2 == 1` 不是必需的。 (2认同)
  • 固定,谢谢,出于某种原因,我认为质数可能是偶数 (2认同)
  • 出于某种原因,我看不出缺少哪些。我得到 set([(29, 31), (59, 61), (5, 7), (71, 73), (41, 43), (3, 5), (17, 19), (11, 13)])。缺少哪些对?您已经将条件(为素数)应用于 r,因此代码应该没问题。 (2认同)