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次。

相关文章
|
26天前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
43 3
|
2月前
|
安全 网络安全 文件存储
思科设备巡检命令Python脚本大集合
【10月更文挑战第18天】
90 1
思科设备巡检命令Python脚本大集合
|
13天前
|
安全
Python-打印99乘法表的两种方法
本文详细介绍了两种实现99乘法表的方法:使用`while`循环和`for`循环。每种方法都包括了步骤解析、代码演示及优缺点分析。文章旨在帮助编程初学者理解和掌握循环结构的应用,内容通俗易懂,适合编程新手阅读。博主表示欢迎读者反馈,共同进步。
|
21天前
|
JSON 安全 API
Python调用API接口的方法
Python调用API接口的方法
88 5
|
1月前
|
算法 决策智能 Python
Python中解决TSP的方法
旅行商问题(TSP)是寻找最短路径,使旅行商能访问每个城市一次并返回起点的经典优化问题。本文介绍使用Python的`ortools`库解决TSP的方法,通过定义城市间的距离矩阵,调用库函数计算最优路径,并打印结果。此方法适用于小规模问题,对于大规模或特定需求,需深入了解算法原理及定制策略。
38 15
WK
|
1月前
|
Python
Python中format_map()方法
在Python中,`format_map()`方法用于使用字典格式化字符串。它接受一个字典作为参数,用字典中的键值对替换字符串中的占位符。此方法适用于从字典动态获取值的场景,尤其在处理大量替换值时更为清晰和方便。
WK
81 36
|
28天前
|
机器学习/深度学习 人工智能 算法
强化学习在游戏AI中的应用,从基本原理、优势、应用场景到具体实现方法,以及Python在其中的作用
本文探讨了强化学习在游戏AI中的应用,从基本原理、优势、应用场景到具体实现方法,以及Python在其中的作用,通过案例分析展示了其潜力,并讨论了面临的挑战及未来发展趋势。强化学习正为游戏AI带来新的可能性。
76 4
|
1月前
|
Python
Python编程中的魔法方法(Magic Methods)
【10月更文挑战第40天】在Python的世界中,魔法方法就像是隐藏在代码背后的神秘力量。它们通常以双下划线开头和结尾,比如 `__init__` 或 `__str__`。这些方法定义了对象的行为,当特定操作发生时自动调用。本文将揭开这些魔法方法的面纱,通过实际例子展示如何利用它们来增强你的类功能。
16 1
|
2月前
|
机器学习/深度学习 数据采集 数据挖掘
11种经典时间序列预测方法:理论、Python实现与应用
本文将总结11种经典的时间序列预测方法,并提供它们在Python中的实现示例。
107 2
11种经典时间序列预测方法:理论、Python实现与应用
|
2月前
|
开发者 Python
Python中的魔法方法与运算符重载
在Python的奇妙世界里,魔法方法(Magic Methods)和运算符重载(Operator Overloading)是两个强大的特性,它们允许开发者以更自然、更直观的方式操作对象。本文将深入探讨这些概念,并通过实例展示如何利用它们来增强代码的可读性和表达力。