Python 中多个集合的对称差集2025年3月17日 | 阅读 8 分钟 本文将讨论使用各种方法在 Python 中查找多个集合的对称差集的问题。 Python 中的集合 在 Python 中,集合是包含在大括号 {} 中的无序、可变且元素唯一的集合。集合中的每个元素都必须是可哈希的,这意味着它可以被唯一标识,并且是不可变的,这意味着一旦添加到集合中就无法更改。集合通常用于需要成员资格测试、去重和无序集合的任务。 对称差集 两个集合之间的对称差集是指一个集合,其中包含存在于其中一个集合中但不两个集合都存在的元素。换句话说,它是每个集合特有的项目集合,排除了两个集合共有的项目。 可以使用 ^ (插入符号) 运算符或 `symmetric_difference()` 方法轻松找到两个集合之间的对称差集。 以下是查找两个集合对称差集的示例 集合 set1 和 set2 之间的对称差集包含 {1, 2, 3, 6, 7, 8},这些元素存在于 set1 或 set2 中,但不在两者中。 注意:在计算对称差集时,原始集合 set1 和 set2 不会被修改。相反,会返回一个包含结果的新集合。多个集合的对称差集 在 Python 中,有多种方法可以计算多个集合的对称差集 例如 如果输入是 输出应该是 Symmetric Difference: {1, 2, 3, 10} 解释 - 1、2 和 3 仅存在于 set1 中,而 10 仅存在于 set4 中。 现在让我们讨论查找多个集合之间对称差集的各种方法 方法 1 - 使用 `Collections` 中的 `Counter`在 Python 中,您可以使用 `collections` 模块中的 `Counter` 来计算多个集合的对称差集 输出 Set difference: {10, 1, 2, 3} 说明 `Counter` 类只接受一个参数(一个可迭代对象)。但是我们有四个集合,为此,我们使用了 `itertools` 中的 **`chain` 函数**将所有集合合并为一个可迭代对象,并将其传递给 `Counter` 类来计算每个元素的出现次数。 `chain` 函数的语法是: **`itertools.chain(*iterables)`** 输出 Single Iter: 1 2 3 4 5 4 5 6 7 8 5 6 7 8 9 6 7 8 9 10 **`Counter`** - `Counter` 是 Python `collections` 模块中的一个内置类,它提供了一种实用方法来计算元素在集合(如列表、元组或字符串)中出现的次数。它专门用于计数,是 `dict` 类的子类。 `Counter` 的语法如下: **`collections.Counter`** **( **[**iterable-or-mapping**]** )** 输出 Each element with frequency: Counter({5: 3, 6: 3, 7: 3, 8: 3, 4: 2, 9: 2, 1: 1, 2: 1, 3: 1, 10: 1}) 在程序末尾,我们过滤出频率为 1 的元素并将其转换为集合。最后,在控制台打印结果。 方法 2 - 使用集合运算 **“并集”和“交集”**让我们先理解一下这个想法。下面是四个集合的维恩图。 ![]() 这些集合的对称差集将只包含 A、B、C 和 D 部分。要找到这一点,我们将取所有集合的并集,然后减去 (A 和 B)、(B 和 C)、(C 和 D) 以及 (A 和 D) 的交集。 并集 (A, B, C, D) = {A, B, C, D, AB, BC, CD, AD, ABC, BCD, ACD, ABD, ABCD} 交集 (A, B) = {AB, ABC, ABD, ABCD} 交集 (B, C) = {BC, ABC, BCD, ABCD} 交集 (C, D) = {CD, BCD, ACD, ABCD} 交集 (A, D) = {AD, ACD, ABD, ABCD} 对称差集 (A, B, C, D) = 并集 (A, B, C, D) - 交集 (A, B) -交集 (B, C) - 交集 (C, D) - 交集 (A, D) 对称差集 (A, B, C, D) = {A, B, C, D} # 期望输出 输出 Set difference: {10, 1, 2, 3} 此方法使用并集和交集来查找所需的并集和交集。此方法的问题在于您必须单独计算集合的交集,而这是可以避免的。您可以对程序进行一些潜在的改进,例如 将 *args 语法与 set.union() 结合使用:您可以使用 *args 语法与 `set.union(*sets)` 将集合解包到 `union()` 方法中,而不是使用 `set1.union(set2, set3, set4)` 将集合链接在一起,这可以使代码更简洁。 方法 3 - 使用 XOR (^) 运算符和集合推导式在此方法中,我们将使用 XOR (^) 运算符来查找集合之间的对称差集,并过滤出仅存在于一个集合中的所有元素。 输出 Symmetric Difference: {10, 1, 2, 3} 说明 在上面的代码中,`symmetric_difference` 变量存储了 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}。在找到对称差集后,我们使用集合推导式过滤出仅存在于一个集合中的元素。 `sum(x in s for s in sets) == 1` 条件,它计算一个元素在所有集合中出现的次数并检查它是否等于 1。过滤后的元素存储在 `set_diff` 变量中。最后,使用带有格式化字符串的 `print()` 语句打印结果对称差集。 方法 4 - 使用并集运算符和集合推导式在此方法中,我们将首先使用并集运算符查找所有集合中的唯一元素。然后,我们将使用集合推导式过滤出仅存在于一个集合中的元素。 输出 Symmetric Difference: {10, 1, 2, 3} 说明 此方法使用并集运算符查找唯一元素,然后过滤出仅存在于一个集合中的元素。有关进一步解释,请参阅方法 3 中的解释。 方法 5 - 使用 `functools` 中的 `reduce` 函数在此方法中,我们将使用 `reduce` 函数查找对称差集,并使用如上所述的集合推导式过滤出仅存在于一个集合中的元素。 输出 Symmetric Difference: {10, 1, 2, 3} 说明 `reduce()` 函数与 `lambda` 函数结合使用,对 `sets` 列表中的成对集合重复应用 `symmetric_difference()` 方法,从第一个集合 (set1) 到最后一个集合 (set4)。 集合推导式过滤元素,过滤后的元素存储在 `set_diff` 中,代表对称差集。 |
AR(增强现实)是一个结合了真实世界和虚拟世界的系统。你玩过“精灵宝可梦 Go”吗?如果你不了解这个游戏,玩家必须打开摄像头,在各处漫游,以寻找一个随机放置在某处的 3D 精灵宝可梦...
阅读 3 分钟
简介 Python 是一种健壮而灵活的编程语言,开发可维护且成功的代码需要清晰有效的函数。本文将探讨许多增强 Python 函数的技术,而无需使用繁琐或重复的代码。通过遵循这些清晰的编码实践,您可以制作出...
阅读 4 分钟
计算器是用于执行数学计算的工具,特别是具有键盘和视觉显示屏的紧凑型电子设备。在这篇文章中,我们将探讨如何使用 PyQt5 来制作一个。实现 GUI 的步骤:创建一个标签,指定其形状并显示...
阅读 8 分钟
介绍 IDLE 代表集成开发和学习环境。轻量级且用户友好的 Python IDLE(集成开发和学习环境)是用于 Python 编程的工具。自版本 1.5.2b1 以来,标准 Python 实现已包含 IDLE,一个集成开发环境。许多 Linux 发行版将其包含在 Python...
阅读 6 分钟
什么是累积和?累积和的意思是“到目前为止的总和”。累积和的定义是给定序列的增加或随着更多加法而变大的总和。累积和的真实例子是不断增加的...
阅读 2 分钟
| 自动化测试 人类在多次做同样的工作时会感到厌烦。我们总是在寻找克服它的方法。所以一个解决方案摆在我们面前:我们可以创建一些东西来做这种任务,...
阅读9分钟
Python 中 yield 和 return 的区别 Python yield 语句 生成器通过在 Python 中使用 yield 语句来定义。通常,它将一个普通的 Python 函数转换为一个生成器。yield 语句暂停函数并将值返回给函数调用者,并从...重新开始。
阅读 4 分钟
在Python中,reduce()是一个内置函数,它将一个给定的函数应用于一个可迭代对象的元素,将它们减少为单个值。reduce()的语法如下:functools.reduce(function, iterable[, initializer]) function参数是一个接收两个参数并返回单个值的函数....
5 分钟阅读
Python是全球增长最快的编程语言之一,其背后的原因不难理解。Python是一种开源的高级编程语言,对于初学者来说易于学习和使用。它被广泛应用于Web开发、数据...
阅读 6 分钟
Python项目(高级)教程旨在扩展和放大您成为世界上最成功人士的雄心壮志。Python是一种编程语言,在大多数情况下,它使用起来非常简单,可以更快、更有效地完成任务。Python...
阅读 23 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India