【问题标题】:Comparing edges in two edgelist ensuring undirected edge condition比较两个边缘列表中的边缘,确保无向边缘条件
【发布时间】:2017-12-01 20:23:22
【问题描述】:
l1= [(1, 4), (1, 5), (2, 4), (3, 5)]
l2= [(3, 5), (1, 4), (2, 3), (3, 4), (2, 5), (4, 5)]

我有两个边缘列表,我想比较两个列表中的边缘并形成 [1,1,0,0,0,0] 形式的向量。这是通过将 l1 的边缘与l2,如果在 l2 中存在边,则为 1,否则为 0。要确保的是,如果边列表中的边在 l1 中的形式为 (1,4) 并且 (4,1) 在 l2 中存在,那么也它应该将其视为已找到。

edit-在真实数据集中向量大小在100,000范围内

【问题讨论】:

  • 您是否考虑过首先将您的图表示为邻接列表而不是边列表(即,作为列表/集合的列表,其中第 i 个包含顶点 i 的所有邻居)?这样可以有效地执行您需要的检查。

标签: python numpy


【解决方案1】:

将l1 变成set 可能值得一次性花费,这样查找速度非常快:
Python - convert list into dictionary in order to reduce complexity

set_l1 = set(l1)  # note different syntactic level from pho7's ans

[int(t in set_l1 or t[::-1] in set_l1) for t in l2]

Out[86]: [1, 1, 0, 0, 0, 0]

【讨论】:

    【解决方案2】:

    如果l1 不是太长(这样时间和内存都不是问题),那么你可以这样做:

    l1_set = [set(e) for e in l1]
    vec = [int(set(e) in l1_set) for e in l2]
    

    那么vec确实是[1, 1, 0, 0, 0, 0]。

    编辑: 或者,您可以首先将您的图表示为邻接列表(而不是边缘列表):

    l1 = [[], [4, 5], [4], [5], [], []]
    l2 = [[], [4], [3, 5], [5, 4], [5], []]
    

    这样,您可以执行所需的检查,而无需创建任何类型的中间数据结构:

    >>> [[int(vertex in l1[n] or n in l1[vertex]) for n in neighbors] for vertex, neighbors in enumerate(l2)]
    [[], [1], [0, 0], [1, 0], [0], []]
    

    但是,如果您的图有很多边,那么您可能需要考虑将图表示为集合列表的这种方法的变体(如 f5r5e5d 所指出的那样)。

    【讨论】:

    • 是在真实数据集中向量大小在100,000范围内
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多