我有非常多的集合(数千个),每个集合对应于一个具有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有没有更有效的方法来做到这一点?特别是,因为我将不得不对大量的集合和多次执行此操作(集合在模型中的每个时间步都会更新)。
发布于 2018-04-16 23:29:38
你可以使用itertools.combinations来加快很多比较的速度,特别是不需要重复,这样(agent1 agent2)和(agent2∩∩)就不会同时进行比较,因为它们的结果是相等的。此外,在比较之前将它们放在一个集合中也会加快速度。
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)的关键顺序得到维护。
https://stackoverflow.com/questions/49860452
复制相似问题