Python Set理解


80

所以我在做家庭作业时遇到了两个问题,而我在第二个问题上陷入了困境。

  1. 使用Python Set Comprehension(Python等效于Set Builder表示法)来生成所有小于100的质数的集合。回想一下,质数是一个大于1的整数,除了除本身和1.将素数集存储在变量中(其他部分将需要它)。输出您的一组素数(例如,带有打印功能)。

  2. 使用Python Set Comprehension生成一组有序对(长度为2的元组),该对对由所有小于100的素数组成的素数对组成。素数对是一对都是奇数的连续奇数对。将一组素数对存储在变量中。您的一组数字将非常有帮助。输出您的素数对集合。

对于第一个,这很完美:

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

但是,我很困惑第二个。我认为我可能必须将set r的笛卡尔积乘以某种东西,但是我不确定。

这使我有点接近,但我只想要连续的对。

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

Answers:


69
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}

不用生成一对素数并对其进行测试,而是获得一个素数,然后查看是否存在相应的较高素数。


14

您可以通过构建适当的谓词作为辅助函数来获得简洁明了的解决方案。换句话说,使用Python set-builder表示法的方式与使用常规数学set-notation编写答案的方式相同。

集合理解背后的全部思想是让我们用与手工数学相同的方式编写代码并进行推理。

有了合适的谓词,问题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:我正在尝试为您提供正确的问题解决技术,而没有给出家庭作业问题的答案。


2
尽管可以将问题2简化为仅遍历问题1的结果,如说明中所述。
Tripleee 2014年

5

您可以生成这样的对:

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

3
我不确定为什么您的更好方法会更好。OP已经有小于100 in的质数r,因此{(x, x + 2) for x in r if x + 2 in r}就足够了。
DSM 2014年

2
and x % 2 == 1没有必要。
thefourtheye 2014年

2
固定,谢谢,出于某些原因,我认为素数可能是偶数
icedtrees 2014年

2
由于某些原因,我看不到缺少哪些。我得到set([[(29,31),(59,61),(5,7),(71,73),(41,43),(3,5),(17,19),(11, 13)])。缺少哪些对?您已经将条件(素数)应用于r,因此代码应该可以。
icedtrees 2014年

不,你是绝对正确的。我给人的印象是(7,11)和(13,17)等...被包括在素数对中,因为它们在素数列表中在技术上是“连续的”。但是现在我明白了。
user3308790 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.