首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个集合的交集,哪些集合相交,哪里相交?

多个集合的交集,哪些集合相交,哪里相交?
EN

Stack Overflow用户
提问于 2018-04-16 22:58:35
回答 1查看 332关注 0票数 0

我有非常多的集合(数千个),每个集合对应于一个具有id的代理(实体)-这可以表示为一个字典,其中每个键( agent_id )都有一个集合(值)。

    agent_path= {a1:(25,60,86,95),a2:(72,34,96,60,12,74,95,43,78),a3:....}

我需要找到不同集合的交集,更重要的是,找出哪些代理彼此相交。

A1∩a2: 60,95

例如,这可以存储在新的字典中。在下一步中,我将不得不再次循环每个具有相交元素的代理,以执行下一个操作。

我的解决方案是在agent_path字典上循环x2,分别比较每个集合,然后将结果保存到字典中:

代码语言:javascript
复制
agent_path=dict()
agent_path['a1']=a
agent_path['a2']=b

agent_inters=dict()
for agent1 in agent_path.keys():
for agent2 in agent_path.keys():
    agent_key=str(agent1)+str(agent2)
    if agent1 == agent2:
        pass
    else:
        set1=set(agent_path[agent1])
        set2=set(agent_path[agent2])
        set1xset2=set1.intersection(set2)
        agent_inters[agent_key]=set1xset2

有没有更有效的方法来做到这一点?特别是,因为我将不得不对大量的集合和多次执行此操作(集合在模型中的每个时间步都会更新)。

EN

回答 1

Stack Overflow用户

发布于 2018-04-16 23:29:38

你可以使用itertools.combinations来加快很多比较的速度,特别是不需要重复,这样(agent1 agent2)和(agent2∩∩)就不会同时进行比较,因为它们的结果是相等的。此外,在比较之前将它们放在一个集合中也会加快速度。

代码语言:javascript
复制
from itertools import combinations

agent_path = {
    "a1": set([25, 60, 86, 95]),
    "a2": set([72, 34, 96, 60, 12, 74, 95, 43, 78]),
    "a3": set([15, 23, 60, 9, 99, 95])
}

agent_inters = {}

for agent1, agent2 in combinations(agent_path, 2):
    agent_key = str(agent1)+str(agent2)
    agent_common = agent_path[agent1] & agent_path[agent2]
    if agent_common:
        agent_inters[agent_key] = agent_common
print(agent_inters)          #Prints {'a1a2': {60, 95}, 'a1a3': {60, 95}, 'a2a3': {60, 95}}

如果您想要将一个更新的集合与其他集合进行比较,您可以创建一个单独的for循环,但保持内部相同(function def!)确保str(agent1)+str(agent2)的关键顺序得到维护。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49860452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档