Python 比较两个边列表中的边,确保无向边条件

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)

我有两个边列表,我想比较这两个列表中的边,并形成一个向量,形式为[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), (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]