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

时间:2018-04-16 14:58:35

标签: python python-3.x performance set set-intersection

我有非常多的集合(数千),每个集合对应一个带有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并单独比较每个集合,然后将结果保存到字典中:

library(tidyverse)

n = c(2, 3, 5) 
s = c("aa", "bb", "cc") 
b = c(TRUE, FALSE, TRUE) 

df = data.frame(n, s, b) %>% 
  unite(x, c(n, s), sep = " ", remove = FALSE)

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

1 个答案:

答案 0 :(得分:1)

你可以利用itertools.combinations来加速很多比较,特别是没有重复,以便(agent1∩agent2)和(agent2∩cyne1)都不会被比较他们的结果是平等的。此外,在比较之前将它们放在一组中也会加快速度。

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)的密钥顺序。< / p>