首页 > 编程语言 >Python实现求多个集合之间并集的方法

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

时间:2024-05-27 16:36:08浏览次数:17  
标签:并集 Python elems c3 集合 c2 c1 c4 union

目的:求多个集合之前的并集,例如:现有四个集合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)

#学习中遇到问题没人解答?小编创建了一个Python学习交流群:153708845
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次。

标签:并集,Python,elems,c3,集合,c2,c1,c4,union
From: https://www.cnblogs.com/python1111/p/18215833

相关文章

  • Python中类创建和实例化过程
    一、type()1、创建类的两种方式方式一classMyClass(object):deffunc(self,name):print(name)myc=MyClass()print(MyClass,type(MyClass))print(myc,type(myc))我们创建了一个名为MyClass的类,并实例化了这个类,得到其对象myc上面代码打印的结果为:<......
  • python实现获取成员所在的多个位置
    注:本代码主要是为了实现多个集合之间求并集时的辅助代码,简单的举个例子来说明代码的功能。约定:例如{11:[2,3]}表示数据11在集合2和集合3中都存在。现有以下数据:d0={38:[2],11:[2,3],22:[2,3]}d1={11:[0,0,1,3],13:[0,0],22:[0,0,3],14:[0,0,1,3]......
  • Python小技巧:一种字符串的排序方式
    1.排序方式假设有一个序列,数据为:['n1','n2','n10','n11','n21','n3','n13','n20','n23'],排序后需要达到这个效果:['n1','n2','n3','n10','......
  • Python(四)——基础控制流程语句:简单用户登录和输出10以内的奇偶数
    例子1:编写一小段代码,输入正确的账号和密码实现登陆操作。利用input函数判断用户名和密码是否正确,正确输出“欢迎您!“,用户名默认admin,密码默认为123代码实现:username=input("请输入用户名:")password=input("请输入密码:")ifusername=="admin":ifpassword=="123......
  • Python可以声明并赋值一个hash类型变量吗?
    在Python中,不能直接声明一个变量为`hash`类型,因为Python是一种动态类型语言,不需要(也不能)在声明变量时指定其类型。变量的类型是根据赋给它的值自动推断的。将一个哈希值(即一个整数)赋值给一个变量,这个哈希值可以是通过调用内置`hash()`函数获得的任何对象的哈希值。例如:```pyt......
  • python-装饰器
    装饰器基本样式defdecorator(func):defwrapper(*args,**kwargs):print("before")res=func(*args,**kwargs)print("after")returnresreturnwrapper@decoratordeffunc():print("hello&quo......
  • python模块之smtplib邮件处理模块
    要求:发送一封简单的邮件发送html格式的邮件在邮件中带图片发送邮件步骤:1.登录邮件服务器2.构造符合邮件协议规则的邮件内容3.发送python对SMTP支持有smtplib和email模块,email负责构造邮件,smtplib负责发送邮件importsmtplibfromemail.mime.textimportMIMETextf......
  • Python闭包和装饰器原理
    #Python闭包和装饰器#############闭包##############'''1.一个外层函数,内嵌一个内层函数;2.内层函数使用外层函数的参数;3.外层函数将内层函数作为返回值返回'''#外层函数defouter(msg):#内层函数definner():#内层函数使用外......
  • Python编程入门:从零开始掌握基础
    Python编程入门:从零开始掌握基础Python是一门简单易学但功能强大的编程语言。它广泛应用于数据科学、机器学习、web开发、自动化任务等领域。本系列文章将带你从零开始学习Python,逐步掌握这门语言的基础知识。本文是系列的第一篇,涵盖Python的基本语法、变量和数据类型等内......
  • Python基础-容器数据
    一、容器类型介绍容器就是存放数据的python中的容器数据有多种形式,每种形式有自己的存储格式,数据存储特性不一样字符串str就是容器存放一个一个字母格式:单引号'数据',双引号"数据",三个引号"""数据"""列表list格式:[数据1,数据2,数据3.....]元祖tuple......