我有非常多的集合(数千),每个集合对应一个带有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)
有更有效的方法吗?特别是,因为我将不得不为大量的集合多次执行此操作(这些集合在模型中的每个时间步骤都会更新)。
答案 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>