Python 比较两个边列表中的边,确保无向边条件
我有两个边列表,我想比较这两个列表中的边,并形成一个向量,形式为[1,1,0,0,0]。这是通过比较l1和l2的边形成的,如果l2中存在边,则为1,否则为0。要确保的是,如果边列表中的边是l1和(4,1)中的(1,4)形式在l2中存在,则也应将其视为已发现Python 比较两个边列表中的边,确保无向边条件,python,numpy,Python,Numpy,我有两个边列表,我想比较这两个列表中的边,并形成一个向量,形式为[1,1,0,0,0]。这是通过比较l1和l2的边形成的,如果l2中存在边,则为1,否则为0。要确保的是,如果边列表中的边是l1和(4,1)中的(1,4)形式在l2中存在,则也应将其视为已发现 在真实数据集中编辑向量大小在100000范围内,如果l1不太长(这样时间和内存就没有问题),则可以执行以下操作: l1= [(1, 4), (1, 5), (2, 4), (3, 5)] l2= [(3, 5), (1, 4), (2, 3)
在真实数据集中编辑向量大小在100000范围内,如果
l1
不太长(这样时间和内存就没有问题),则可以执行以下操作:
l1= [(1, 4), (1, 5), (2, 4), (3, 5)]
l2= [(3, 5), (1, 4), (2, 3), (3, 4), (2, 5), (4, 5)]
那么vec
确实是[1,1,0,0,0,0]
编辑:
或者,您可以首先将图形表示为邻接列表(而不是边列表):
l1_set = [set(e) for e in l1]
vec = [int(set(e) in l1_set) for e in l2]
这样,您就可以执行所需的检查,而无需创建任何类型的中间数据结构:
l1 = [[], [4, 5], [4], [5], [], []]
l2 = [[], [4], [3, 5], [5, 4], [5], []]
但是,如果您的图形有许多边,那么您可能需要考虑将图形表示为集合列表的这种方法的变体(如f5r5e5d所指出的)。将
l1
转换为集合的一次性成本可能是值得的,因此查找速度非常快:
是的,在真实的数据集中,在100000范围内的向量大小,你是否认为你的图形代表邻接列表而不是第一个列表的边缘(即,作为列表/集合的列表,使得这些i的i包含顶点i的所有邻居)?这样可以有效地执行所需的检查。
>>> [[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], []]
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]