之前使用过一种方法实现求集合间的并集,参考文章:https://www.cnblogs.com/mrlayfolk/p/12373532.html,这次使用另外一种方法实现,这种方法效率更高。

目的:

求多个集合之前的并集,例如:现有四个集合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}。如下图所示:

实现步骤:

以上述的四个集合为例进行说明:C1 = {11, 22, 13, 14}、C2  = {11, 32, 23, 14, 35}、C3 = {11, 22, 38}、C4 = {11, 22, 33, 14, 55, 66}。

(1)首先找到成员数最多的集合,为C4 = {11, 22, 33, 14, 55, 66},将C4的每个成员依次和各个集合的成员进行比较,判断这个成员是否再其它集合中存在。

(2)经过比较我们可以得到:11∈C1、C2、C3、C4;    22∈C1、C3、C4;    14∈C1、C2、C4;    33、55、66∈C4。

(3)接着,将除C4以外,剩余集合的剩余成员找出来,C1 = {13},C2 =  {32、23、35},C3 = {38}。

(4)找出成员数最多的集合,这里是C2,将C2的各个成员和其它集合进行比较。得到:32、23、35∈C2;

(5)接着只剩下C1和C3了,两个集合的成员数一样,例如使用C1的成员和C3进行比较之后,得到:13∈C1,38∈C3。

通过上述步骤,我们最终得到:C1 & C2 & C3 = {11}、C1 & C2 & C4 = {14}、C1 & C3 & C4 = {22}。

当然,也可以先找出成员数最少的集合,逐个使用这个集合的成员与其它集合的成员进行对比,也能够得到各个集合之间的交集。

实现代码:

下面python代码实现的是每次使用成员数最少的集合和其它集合的成员进行对比的情况:

 1 # decoding: utf-8
2
3 import os
4 import sys
5 import xlrd
6 import logging
7 import csv
8 import numpy as np
9
10 # 设置logging.basicConfig()方法的参数和配置logging.basicConfig函数
11 FORMAT = '[%(funcName)s: %(lineno)d]: %(message)s'
12 LEVEL = logging.INFO
13 logging.basicConfig(level = LEVEL, format=FORMAT)
14
15
16 def func(content):
17 all_dict = {}
18 for d in content:
19 for k in d.keys():
20 tmp_value = d[k]
21 if k in all_dict.keys():
22 tmp_values = all_dict[k]
23 # 更新成员数
24 for i in range(len(tmp_value)):
25 if tmp_value[i] not in tmp_values:
26 tmp_values.append(tmp_value[i])
27 all_dict[k] = tmp_values
28
29 if k not in all_dict.keys():
30 # 这里需要处理一种情况:如13: [0, 0],某个字典的值有重复的元素。
31 tmp_values = []
32 for i in range(len(tmp_value)):
33 tmp = tmp_value[i]
34 if tmp in tmp_values:
35 continue
36 tmp_values.append(tmp)
37 all_dict[k] = tmp_values
38
39 return all_dict
40
41
42 # get union sets from collections
43 def get_unions(content):
44 c_mems_list = []
45 for c in content:
46 c_mems_list.append(len(c))
47 # print (c_mems_list)
48
49 mems_list_index = np.argsort(c_mems_list)
50 # print (mems_list_index)
51
52 # 取成员数最小的集合的成员依次和其它集合进行比较
53 all_index_list = []
54 for c_index in mems_list_index:
55 min_c = content[c_index] #成员数最小的集合
56 elem_index = {} # 存放成员所在集合的索引,格式如下:[elem, index]
57 for elem in min_c: # 判断成员数最小的集合的各个成员是否在其它集合中存在
58 index_tmp = []
59 index_tmp.append(c_index) #首先存放成员数最小集合的索引
60 for other_index in mems_list_index[c_index+1: ]: # 开始判断本成员在其它集合中是否存在
61 if elem in content[other_index]: #若存在,加入到成员所在集合的索引中去
62 index_tmp.append(other_index)
63 elem_index[elem] = index_tmp
64 all_index_list.append(elem_index)
65
66 # print (all_index_list)
67 all_dict = func(all_index_list) #将重复的索引删除掉
68
69 return all_dict
70
71
72 if __name__ == "__main__":
73
74 # original data
75 C0 = {11, 22, 13, 14}
76 C1 = {11, 32, 23, 14, 35}
77 C2 = {11, 22, 38}
78 C3 = {11, 22, 33, 14, 55, 66}
79
80 print ('############## enter main ##############')
81 res = get_unions([C0, C1, C2, C3])
82 for key in res:
83 print (key, ':', res[key])
84 print ('############## end main ##############')

输出结果如下:

 1 ############## enter main ##############
2 38 : [2]
3 11 : [2, 3, 0, 1]
4 22 : [2, 3, 0]
5 13 : [0]
6 14 : [0, 1, 3]
7 32 : [1]
8 35 : [1]
9 23 : [1]
10 33 : [3]
11 66 : [3]
12 55 : [3]
13 ############## end main ##############

下面我们换一组数据进行测试:

 1 if __name__ == "__main__":
2
3 # original data
4 C0 = {11, 22, 13, 14, 15}
5 C1 = {11, 22, 23, 14, 35}
6 C2 = {11, 22, 38, 15, 66}
7 C3 = {11, 22, 33, 14, 55, 66}
8 C4 = {22, 33, 15, 89, 33}
9
10 print ('############## enter main ##############')
11 res = get_unions([C0, C1, C2, C3, C4])
12 for key in res:
13 print (key, ':', res[key])
14 print ('############## end main ##############')

输出结果如下:

 1 ############## enter main ##############
2 89 : [4]
3 33 : [4, 3]
4 22 : [4, 0, 1, 2, 3]
5 15 : [4, 0, 2]
6 11 : [0, 1, 2, 3]
7 13 : [0]
8 14 : [0, 1, 3]
9 35 : [1]
10 23 : [1]
11 66 : [2, 3]
12 38 : [2]
13 55 : [3]
14 ############## end main ##############

可以看出,输出的结果和预期的一致。

Python实现求多个集合之间的并集-方法2的更多相关文章

  1. Python实现求多个集合之间的并集

    目的:求多个集合之前的并集,例如:现有四个集合C1 = {11, 22, 13, 14}.C2  = {11, 32, 23, 14, 35}.C3 = {11, 22, 38}.C4 = {11,  ...

  2. python元组-字典-集合及其内置方法(下)

    列表补充 补充方法 清空列表 clear # clear 清空列表 l = [1, 2, 3, 4, 4] print(l.clear()) # clear没有返回值(None) print(l) # ...

  3. 第四节 Python基础之数据类型(集合)

    在学习本节之前,我们先对数据类型做一个补充,也就是数据类型的分类: 按照可变和不可变来分: 可变:列表,字典 不可变:数字,字符串,元组 按照访问顺序来分: 顺序访问:字符串,列表,元组 映射的方式访 ...

  4. Python数据类型(字典和集合)

    1.5 Dictionary(字典) 在Python中,字典用放在花括号{}中一系列键-值对表示.键和值之间用冒号分隔,键-值对之间用逗号分隔. 在字典中,你想存储多少个键-值对都可以.每个键都与一个 ...

  5. python 字典,列表,集合,字符串,基础进阶

    python列表基础 首先当然是要说基础啦 列表list 1.L.append(object) -> None 在列表末尾添加单个元素,任何类型都可以,包括列表或元组等 2.L.extend(i ...

  6. python大法好——字典、集合

    字典 前面我们说过列表,它适合于将值组织到一个结构中并且通过编号对其进行引用.字典则是通过名字来引用值的数据结构,并且把这种数据结构称为映射,字典中的值没有特殊的顺序,都存储在一个特定的键(key)下 ...

  7. 《转》python学习(10)-集合

    转自 http://www.cnblogs.com/BeginMan/p/3160565.html 一.目录 1.集合概述 2.关于集合的操作符.关系符号 3.集合的一系列操作(添加.更新.访问.删除 ...

  8. python 操作redis之——有序集合(sorted set) (七)

    #coding:utf8 import redis r =redis.Redis(host=") 1.Zadd 命令用于将一个或多个成员元素及其分数值加入到有序集当中.如果某个成员已经是有序 ...

  9. Python初学者第十天 集合、十六进制

    10day 数据类型:集合 set 1.集合的定义 集合:无序的.不重复的数据组合. 特性:a.去重,把一个列表变成集合,就自动去重了 b.关系测试.测试两组数据之间的交集.差集.并集等关系 2.集合 ...

  10. java求两个集合的交集和并集,比较器

    求连个集合的交集: import java.util.ArrayList; import java.util.List; public class TestCollection { public st ...

随机推荐

  1. vue-cli4.0 (vue3.0 的脚手架)

    前言: 这个搭建脚手架的话实际是我们创建一个新项目的第一步,当然,现在脚手架4.0都出来了,经过使用后发现跟我们之前的3.0使用方法是答题一样的,其中用vue-cli3.0来搭建我们的项目的话又分为两 ...

  2. flask通过线程池实现异步

    from flask import Flask from time import sleep from concurrent.futures import ThreadPoolExecutor # D ...

  3. 登录chatgpt的时候出现429的解决方法,亲测有效

    登录chatgpt的时候出现429的解决方法 PS:在2023年3月14日晚还是可以用的,亲测有效 登录chatgpt的时候出现429的解决方法 很多时候在国内用代理进入chatgpt的时候会出现42 ...

  4. 力扣1662(java&python)-检查两个字符串数组是否相等(简单)

    题目: 给你两个字符串数组 word1 和 word2 .如果两个数组表示的字符串相同,返回 true :否则,返回 false . 数组表示的字符串 是由数组中的所有元素 按顺序 连接形成的字符串. ...

  5. 成本节省 50%,9人团队使用函数计算开发 wolai 在线文档应用

    简介: 通过使用函数计算,wolai 的前端工程师们就可以把从前到后的一整套开发流程负责起来,我们的研发迭代速度非常快.   ​ 作者| 马锐拉(wolai.com 创始人) 我们的日常工作场景几乎离 ...

  6. 阿里云发布企业云原生IT成本治理方案:五大能力加速企业 FinOps 进程

    ​简介:阿里云企业云原生 IT 成本治理方案助力企业落地企业 IT 成本治理的理念.工具与流程,让企业在云原生化的过程中可以数字化地实现企业 IT 成本管理与优化,成为 FinOps 领域的践行者与领 ...

  7. OpenTelemetry 简析

    简介: OpenTelemetry 是 CNCF 的一个可观测性项目,旨在提供可观测性领域的标准化方案,解决观测数据的数据模型.采集.处理.导出等的标准化问题,提供与三方 vendor 无关的服务. ...

  8. 面对DNS劫持,只能坐以待毙吗?

    ​简介: 借助 ARMS-云拨测,我们可实时对网站进行监控,实现分钟级别的监控,及时发现 DNS 劫持以及页面篡改. 作者:白玙 DNS 劫持作为最常见的网络攻击方式,是每个站长或者运维团队最为头疼的 ...

  9. [Go] 获得一个整数范围区间的随机数 (golang)

    示例:0,1 随机 package main import "fmt" import "math/rand" import "time" f ...

  10. dotnet 修复在 Linux 上使用 SkiaSharp 提示找不到 libSkiaSharp 库

    本文告诉大家如何简单修复在 Linux 上使用 SkiaSharp 提示找不到 libSkiaSharp 库 我的应用在 Windows 上跑的好好的,放在 Linux 上一运行就炸掉了,异常内容如下 ...