繁体   English   中英

多个集合的交集,哪一个相交,在哪里?

[英]Intersection of multiple sets, which ones intersect and where?

我有大量的集合(数千个),每个集合对应一个具有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并分别比较每个集合,然后将结果保存到字典中:

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

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

您可以使用itertools.combinations来加快很多比较的速度,特别是没有重复时,这样(agent1∩agent2)和(agent2∩agent1)不会被比较,因为它们的结果相等。 同样,将它们放在比较之前的集合中也会加快速度。

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循环,但请保持相同的内在函数(函数def!),以确保保留str(agent1)+str(agent2)的键顺序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM