【问题标题】:Intersection of multiple sets, which ones intersect and where?多个集合的交集,哪些相交,在哪里?
【发布时间】:2018-04-16 14:58:35
【问题描述】:

我有非常多的集合(数千个),每个集合对应一个具有 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

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

【问题讨论】:

  • 请让我们知道答案是否足以通过接受它来帮助解决您的需求。如果没有,请告诉我们如何改进。

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


【解决方案1】:

您可以使用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) 的键顺序。

【讨论】:

    猜你喜欢
    • 2011-04-29
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多