Python实现求多个集合之间的并集-方法2
之前使用过一种方法实现求集合间的并集,参考文章: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的更多相关文章
- Python实现求多个集合之间的并集
目的:求多个集合之前的并集,例如:现有四个集合C1 = {11, 22, 13, 14}.C2 = {11, 32, 23, 14, 35}.C3 = {11, 22, 38}.C4 = {11, ...
- python元组-字典-集合及其内置方法(下)
列表补充 补充方法 清空列表 clear # clear 清空列表 l = [1, 2, 3, 4, 4] print(l.clear()) # clear没有返回值(None) print(l) # ...
- 第四节 Python基础之数据类型(集合)
在学习本节之前,我们先对数据类型做一个补充,也就是数据类型的分类: 按照可变和不可变来分: 可变:列表,字典 不可变:数字,字符串,元组 按照访问顺序来分: 顺序访问:字符串,列表,元组 映射的方式访 ...
- Python数据类型(字典和集合)
1.5 Dictionary(字典) 在Python中,字典用放在花括号{}中一系列键-值对表示.键和值之间用冒号分隔,键-值对之间用逗号分隔. 在字典中,你想存储多少个键-值对都可以.每个键都与一个 ...
- python 字典,列表,集合,字符串,基础进阶
python列表基础 首先当然是要说基础啦 列表list 1.L.append(object) -> None 在列表末尾添加单个元素,任何类型都可以,包括列表或元组等 2.L.extend(i ...
- python大法好——字典、集合
字典 前面我们说过列表,它适合于将值组织到一个结构中并且通过编号对其进行引用.字典则是通过名字来引用值的数据结构,并且把这种数据结构称为映射,字典中的值没有特殊的顺序,都存储在一个特定的键(key)下 ...
- 《转》python学习(10)-集合
转自 http://www.cnblogs.com/BeginMan/p/3160565.html 一.目录 1.集合概述 2.关于集合的操作符.关系符号 3.集合的一系列操作(添加.更新.访问.删除 ...
- python 操作redis之——有序集合(sorted set) (七)
#coding:utf8 import redis r =redis.Redis(host=") 1.Zadd 命令用于将一个或多个成员元素及其分数值加入到有序集当中.如果某个成员已经是有序 ...
- Python初学者第十天 集合、十六进制
10day 数据类型:集合 set 1.集合的定义 集合:无序的.不重复的数据组合. 特性:a.去重,把一个列表变成集合,就自动去重了 b.关系测试.测试两组数据之间的交集.差集.并集等关系 2.集合 ...
- java求两个集合的交集和并集,比较器
求连个集合的交集: import java.util.ArrayList; import java.util.List; public class TestCollection { public st ...
随机推荐
- 力扣58(java)-最后一个单词的长度(简单)
题目: 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开.返回字符串中 最后一个 单词的长度. 单词 是指仅由字母组成.不包含任何空格字符的最大子字符串. 示例 1: 输入:s = &q ...
- 基于阿里云GPU云服务器的AIACC助力UC搜索业务性能提效380%,每年节省数千万成本
简介: 用阿里云GPU计算实例来满足UC极致性价比需求 文丨阿里云神龙计算平台AI加速团队 & UC搜索架构部推理引擎团队 导语:作为国产行列里占有率排名第一的移动浏览器,UC浏览器自身承载着 ...
- 消息队列Kafka「检索组件」重磅上线!
简介:本文对消息队列 Kafka「检索组件」进行详细介绍,首先通过对消息队列使用过程中的痛点问题进行介绍,然后针对痛点问题提出相应的解决办法,并对关键技术技术进行解读,旨在帮助大家对消息队列 Kaf ...
- 入选 SIGMOD2021 的时间序列多周期检测通用框架 RobustPeriod 如何支撑阿里业务场景?
简介: 本文除了介绍RobustPeriod的核心技术亮点,还将重点解释如何将它构筑成服务来解决阿里云的业务痛点. 近日,由阿里云计算平台和阿里云达摩院合作的时序多周期检测相关论文RobustPeri ...
- 可观测告警运维系统调研——SLS告警与多款方案对比
简介: 本文介绍对比多款告警监控运维平台方案,覆盖阿里云SLS.Azure.AWS.自建系统(ELK.Prometheus.TICK)等方案. 前言 本篇是SLS新版告警系列宣传与培训的第三篇,后续我 ...
- 【详谈 Delta Lake 】系列技术专题 之 特性(Features)
简介: 本文翻译自大数据技术公司 Databricks 针对数据湖 Delta Lake 的系列技术文章.众所周知,Databricks 主导着开源大数据社区 Apache Spark.Delta L ...
- 【ESSD技术解读-02】企业级利器,阿里云 NVMe 盘和共享存储
简介: 当前 NVMe 云盘结合了业界最先进的软硬件技术,在云存储市场,首创性同时实现了 NVMe 协议 + 共享访问 + IO Fencing 技术.它在 ESSD 之上获得了高可靠.高可用.高性能 ...
- dotnet 解析 TTF 字体文件格式
在 Windows 下,可以使用 DX 提供的强大能力,调用 DX 读取 TTF 字体文件,获取字体文件的信息以及额外的渲染信息.特别是基于 DX 的 WPF 更是加了一层封装,使用 FontFami ...
- Microsoft.Maui.Graphics.Skia 使用 DrawString 绘制文本的坐标问题
本文记录使用 Microsoft.Maui.Graphics.Skia 的 DrawString 进行绘制文本,不同的重载方法绘制的文本的坐标不同的问题 本文开始之前,预期已经准备好了环境和基础项目, ...
- JavaScript数组Array方法介绍,使用示例及ES6拓展
数组定义 有次序和编号的一组值 类似数组对象 函数agruments对象,字符串,DOM元素集 实例属性 Array.prototype.length length可以赋值,用以改变数组长度 arr. ...