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

相关文章
|
2月前
|
机器学习/深度学习 数据可视化 算法
Python数值方法在工程和科学问题解决中的应用
本文探讨了Python数值方法在工程和科学领域的广泛应用。首先介绍了数值计算的基本概念及Python的优势,如易学易用、丰富的库支持和跨平台性。接着分析了Python在有限元分析、信号处理、优化问题求解和控制系统设计等工程问题中的应用,以及在数据分析、机器学习、模拟建模和深度学习等科学问题中的实践。通过具体案例,展示了Python解决实际问题的能力,最后总结展望了Python在未来工程和科学研究中的发展潜力。
|
26天前
|
Python
Python技术解析:了解数字类型及数据类型转换的方法。
在Python的世界里,数字并不只是简单的数学符号,他们更多的是一种生动有趣的语言,用来表达我们的思维和创意。希望你从这个小小的讲解中学到了有趣的内容,用Python的魔法揭示数字的奥秘。
64 26
|
16天前
|
JSON 数据格式 Python
解决Python requests库POST请求参数顺序问题的方法。
总之,想要在Python的requests库里保持POST参数顺序,你要像捋顺头发一样捋顺它们,在向服务器炫耀你那有条不紊的数据前。抓紧手中的 `OrderedDict`与 `json`这两把钥匙,就能向服务端展示你的请求参数就像经过高端配置的快递包裹,里面的商品摆放井井有条,任何时候开箱都是一种享受。
38 10
|
1月前
|
Python
在VScode环境下配置Python环境的方法
经过上述步骤,你的VSCode环境就已经配置好了。请尽情享受这扇你为自己开启的知识之窗。如同你在冒险世界中前行,你的探索之路只有越走越广,你获得的知识只会越来越丰富,你的能力只会越来越强。
125 37
|
25天前
|
Python
Python 中__new__方法详解及使用
__new__ 是 Python 中用于创建类实例的静态方法,在实例化对象时优先于 __init__ 执行。它定义在基础类 object 中,需传递 cls 参数(表示当前类)。__new__ 可决定是否使用 __init__ 方法或返回其他对象作为实例。特性包括:1) 在实例化前调用;2) 始终为静态方法。示例中展示了其用法及 Python2 和 Python3 的差异,强调了参数处理的不同。
81 10
|
25天前
|
人工智能 Ruby Python
python__init__方法笔记
本文总结了Python中`__init__`方法的使用要点,包括子类对父类构造方法的调用规则。当子类未重写`__init__`时,实例化会自动调用父类的构造方法;若重写,则需通过`super()`或直接调用父类名称来显式继承父类初始化逻辑。文中通过具体代码示例展示了不同场景下的行为及输出结果,帮助理解类属性与成员变量的关系,以及如何正确使用`super()`实现构造方法的继承。
|
1月前
|
存储 索引 Python
[oeasy]python093_find方法_指数为负数_index_实际效果
本文介绍了Python中`find`方法与索引(index)的使用,包括负数索引的实际效果。回顾了`eval`函数的应用,并强调类名如`str`、`int`、`list`不可用作变量名以避免覆盖。通过示例解析了负数索引在字符串和列表中的作用,以及`index`方法的三个参数(value、start、stop)的用法。同时对比了`index`和`find`方法的区别:`index`找不到子串时抛出`ValueError`,而`find`返回-1。最后总结了正负索引的使用场景及两者的特性,提供了相关学习资源链接。
293 8
|
2月前
|
存储 缓存 安全
Python frozenset 集合详解:不可变集合的终极指南
frozenset是Python中一个常被忽视但极具价值的不可变集合类型。本文深入解析其本质、操作方法与应用场景,揭示其通过不可变性带来的安全性与性能优势。从底层实现到实战案例,涵盖字典键使用、缓存优化及类型注解等高级场景。同时对比性能数据,提供最佳实践指南,并展望Python 3.11+中的优化。掌握frozenset,可为代码带来更强健性与效率,适合多种特定需求场景。
92 5
|
2月前
|
Python
解决Python报错:DataFrame对象没有concat属性的多种方法(解决方案汇总)
总的来说,解决“DataFrame对象没有concat属性”的错误的关键是理解concat函数应该如何正确使用,以及Pandas库提供了哪些其他的数据连接方法。希望这些方法能帮助你解决问题。记住,编程就像是解谜游戏,每一个错误都是一个谜题,解决它们需要耐心和细心。
133 15
|
1月前
|
Python
Python 中__new__方法详解及使用
`__new__` 是 Python 中的一个特殊方法,用于控制对象的创建过程,在 `__init__` 之前执行。它是类的静态方法,负责返回一个实例。如果 `__new__` 不返回对象,`__init__` 将不会被调用。本文详细介绍了 `__new__` 的作用、特性及与 `__init__` 的区别,并通过实例演示了其在单例模式中的应用,同时对比了 Python2 和 Python3 中的写法差异。

热门文章

最新文章

推荐镜像

更多
下一篇
oss创建bucket