Python实现求多个集合之间并集的方法

简介: Python实现求多个集合之间并集的方法

​目的:求多个集合之前的并集,例如:现有四个集合C1 = {11, 22, 13, 14}、C2 = {11, 32, 23, 14, 35}、C3 = {11, 22, 38}、C4 = {11, 22, 33, 14, 55, 66},则它们之间的并集应该为:

C1 & C2 & C3 = {
   
   11}、C1 & C2 & C4 = {
   
   14}、C1 & C3 & C4 = {
   
   22}

如下图所示:

请在此添加图片描述

实现方法:Python自带了set数据类型,并且可以实现求集合的并集、交集、差集等,十分好用。按照一般的数学方法实现,实现的步骤如下:

(1)先求4个集合共有的成员;

(2)每个集合减去所有集合的共有成员,在求其中任意3个集合共有的成员;

(3)每个集合减去包含自己的任意三个集合的共有成员,最后求其中任意两个集合共有的成员。

具体的代码如下:

# encoding: utf-8

def func(content):
    # 使用集合实现, 使用集合真是太方便了

    c1 = set(content[0])  # [11, 22, 13, 14]
    c2 = set(content[1])  # [11, 32, 23, 14, 35]
    c3 = set(content[2])  # [11, 22, 38]
    c4 = set(content[3])  # [11, 22, 33, 14, 55, 66]

    # all collections have element
    all_union_elems = c1 & c2 & c3 & c4
    if all_union_elems:
        print ('all collections have elems: ', all_union_elems)

    # three collections have
    c1 = c1 - all_union_elems
    c2 = c2 - all_union_elems
    c3 = c3 - all_union_elems
    c4 = c4 - all_union_elems
    c123_union_elems = c1 & c2 & c3
    c124_union_elems = c1 & c2 & c4
    c134_union_elems = c1 & c3 & c4
    c234_union_elems = c2 & c3 & c4
    if c123_union_elems:
        print ("c123_union_elems ", c123_union_elems)
    if c124_union_elems:
        print ("c124_union_elems ", c124_union_elems)
    if c134_union_elems:
        print ("c134_union_elems ", c134_union_elems)
    if c234_union_elems:
        print ("c234_union_elems ", c234_union_elems)

    # two collections have
    c1 = c1 - c123_union_elems - c124_union_elems - c134_union_elems
    c2 = c2 - c123_union_elems - c124_union_elems - c234_union_elems
    c3 = c3 - c123_union_elems - c134_union_elems - c234_union_elems
    c4 = c4 - c124_union_elems - c134_union_elems - c234_union_elems
    c12_union_have = c1 & c2
    c13_union_have = c1 & c3
    c14_union_have = c1 & c4
    c23_union_have = c2 & c3
    c24_union_have = c2 & c4
    c34_union_have = c3 & c4
    if c12_union_have:
        print ("c12_union_have ", c12_union_have)
    if c13_union_have:
        print ("c13_union_have ", c13_union_have)
    if c14_union_have:
        print ("c14_union_have ", c14_union_have)
    if c23_union_have:
        print ("c23_union_have ", c23_union_have)
    if c24_union_have:
        print ("c24_union_have ", c24_union_have)
    if c34_union_have:
        print ("c34_union_have ", c34_union_have)

    c1 = c1 - c12_union_have - c13_union_have - c14_union_have
    c2 = c2 - c12_union_have - c23_union_have - c24_union_have
    c3 = c3 - c13_union_have - c23_union_have - c34_union_have
    c4 = c4 - c14_union_have - c24_union_have - c34_union_have
    if c1:
        print ('only c1 have ', c1)
    if c2:
        print ('only c2 have ', c2)
    if c3:
        print ('only c3 have ', c3)
    if c4:
        print ('only c4 have ', c4)


if __name__ == "__main__":

    content = [[11, 22, 13, 14], [11, 32, 23, 14, 35], [11, 22, 38], [11, 22, 33, 14, 55, 66]]

    func(content)

输出结果如下:

all collections have elems:  {
   
   11}
c124_union_elems  {
   
   14}
c134_union_elems  {
   
   22}
only c1 have  {
   
   13}
only c2 have  {
   
   32, 35, 23}
only c3 have  {
   
   38}
only c4 have  {
   
   33, 66, 55}

这种实现方法其实效率不高,需要比较集合的次数为:1 + 4 + 6 = 11次,另外代码也很冗余,并不是一种好的实现方式。

还有另外一种效率高的实现方式:

(1)首先,先找出成员数最多的那个集合,这里就是集合C4;

(2)将集合C4中的每个成员依次和其它集合进行比较,看其它集合中是否包含此成员;

(3)若其它集合中包括这个成员,就将这个成员从集合中去除,依次这样比较每个集合;

(4)比较一轮之后,集合C4中剩余的成员就是只有自己的成员。

(5)再在除C4以外剩下的集合中,找出成员数最多的集合,重复上诉操作。依次类推,就可以求出各集合之间的并集了。

上述算法中需要比较的次数只有3 + 2 + 1 = 6次。

相关文章
|
3天前
|
机器学习/深度学习 数据采集 算法
数据稀缺条件下的时间序列微分:符号回归(Symbolic Regression)方法介绍与Python示例
有多种方法可以处理时间序列数据中的噪声。本文将介绍一种在我们的研究项目中表现良好的方法,特别适用于时间序列概况中数据点较少的情况。
16 1
数据稀缺条件下的时间序列微分:符号回归(Symbolic Regression)方法介绍与Python示例
|
4天前
|
消息中间件 关系型数据库 数据库
Python实时监测数据库表数据变化的方法
在实现时,需要考虑到应用的实时性需求、数据库性能影响以及网络延迟等因素,选择最适合的方法。每种方法都有其适用场景和限制,理解这些方法的原理和应用,将帮助开发者在实际项目中做出最合适的技术选择。
39 17
|
4天前
|
XML 数据格式 Python
Python技巧:将HTML实体代码转换为文本的方法
在选择方法时,考虑到实际的应用场景和需求是很重要的。通常,使用标准库的 `html`模块就足以满足大多数基本需求。对于复杂的HTML文档处理,则可能需要 `BeautifulSoup`。而在特殊场合,或者为了最大限度的控制和定制化,可以考虑正则表达式。
21 12
|
2天前
|
Python
全网最适合入门的面向对象编程教程:Python函数方法与接口-函数与方法的区别和lamda匿名函数
【9月更文挑战第15天】在 Python 中,函数与方法有所区别:函数是独立的代码块,可通过函数名直接调用,不依赖特定类或对象;方法则是与类或对象关联的函数,通常在类内部定义并通过对象调用。Lambda 函数是一种简洁的匿名函数定义方式,常用于简单的操作或作为其他函数的参数。根据需求,可选择使用函数、方法或 lambda 函数来实现代码逻辑。
|
10天前
|
Python
Python中几种lambda排序方法
【9月更文挑战第7天】在Python中,`lambda`表达式常用于配合排序函数,实现灵活的数据排序。对于基本列表,可以直接使用`sorted()`进行升序或降序排序;处理复杂对象如字典列表时,通过`lambda`指定键值进行排序;同样地,`lambda`也适用于根据元组的不同位置元素来进行排序。
|
21天前
|
索引 Python 容器
为什么Python中会有集合set类型?
为什么Python中会有集合set类型?
|
21天前
|
Python
|
1天前
|
存储 数据挖掘 测试技术
Python接口自动化中操作Excel文件的技术方法
通过上述方法和库,Python接口自动化中的Excel操作变得既简单又高效,有助于提升自动化测试的整体质量和效率。
8 0
|
2天前
|
数据处理 开发者 Python
探索Python中的列表推导式在Python编程中,列表推导式是一种简洁而高效的方法,用于从现有的列表创建新列表。本文将深入探讨列表推导式的用法、优势以及一些实际应用示例。
列表推导式是Python提供的一种强大工具,它允许开发者以更简洁的语法快速生成列表。通过结合循环和条件语句,列表推导式能够简化代码结构,提高开发效率。本文详细介绍了列表推导式的基本用法,并通过实例展示了其在数据处理、转换和过滤中的广泛应用。
8 0
|
19天前
|
UED Python
探索Python中的魔法方法:打造自定义字符串表示
【8月更文挑战第31天】在Python的世界里,魔法方法是那些以双下划线开头和结尾的特殊方法,它们为类提供了丰富的功能。本文将带你走进这些魔法方法的背后,特别是__str__和__repr__,揭示如何通过它们来定制我们的对象在被打印或转换为字符串时的外观。我们将从基础用法开始,逐步深入到高级技巧,包括继承与重写,最终实现一个优雅的字符串表示方案。准备好了吗?让我们开始这段代码之旅吧!