Python 集合理解

Posted

技术标签:

【中文标题】Python 集合理解【英文标题】:Python Set Comprehension 【发布时间】:2014-03-13 07:32:01 【问题描述】:

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

    使用 Python Set Comprehension(Python 相当于 Set Builder 表示法)生成一组小于 100 的所有素数。回想一下,素数是大于 1 且不大于 1 的整数可被除自身和 1 以外的任何整数整除。将素数集存储在变量中(附加部分将需要它)。输出您的素数集(例如,使用打印功能)。

    使用 Python Set Comprehension 生成一组有序对(长度为 2 的元组),其中包含由小于 100 的素数组成的所有素数对。素数对是一对连续的奇数,它们是两者都是素数。将您的 Prime Pairs 集合存储在一个变量中。您的 1 号套装将非常有帮助。输出你的 Prime Pairs 集合。

对于第一个,这非常有效:

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 

【问题讨论】:

【参考方案1】:

您可以像这样生成对:

(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

【讨论】:

出于某种原因,我看不到缺少哪些。我得到 set([(29, 31), (59, 61), (5, 7), (71, 73), (41, 43), (3, 5), (17, 19), (11, 13)])。缺少哪些配对?您已经将条件(为素数)应用于 r,所以代码应该没问题。 不,你完全正确。我的印象是(7,11)和(13,17)等......被包含在素数对中,因为它们在素数列表中技术上是“连续的”。但现在我明白了。 摆脱“不同的方式”,它有二次性能,更难阅读 我认为这样做很好,因为它类似于发布者尝试他们的解决方案的方式,并且可以帮助发布者了解他们需要做什么。但你是对的,它比较慢,我已经将其添加为注释。【参考方案2】:
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

我也限制了 y 的范围;测试除数 > sqrt(x) 没有意义。所以 max(x) == 100 意味着 max(y) == 10。对于 x

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

与其生成素数对并对其进行测试,不如获取一对素数并查看相应的更高素数是否存在。

【讨论】:

【参考方案3】:

您可以通过将适当的谓词构建为辅助函数来获得简洁明了的解决方案。换句话说,使用 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)

请注意,这段代码是问题规范的直接翻译,“素数对是一对连续的奇数,它们都是素数。”

附:我试图给你正确的解决问题的技巧,而不是真正给出家庭作业问题的答案。

【讨论】:

虽然问题 2 可以简化为仅循环遍历问题 1 的结果,如说明中所暗示的那样。

以上是关于Python 集合理解的主要内容,如果未能解决你的问题,请参考以下文章

python reduce找到集合的并集

深入理解python列表和元组

如何理解python的多线程编程

更深层次理解Python的 列表元组字典集合(工作面试学习必需掌握的知识点)

可理解的聚类

Python程序设计 实验4:字典集合的应用