“无向”元组比较

2024-09-25 02:37:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在python中研究一个无向图,其中的边由元组表示(A和B之间的边由(A,B)或(B,A)表示)。我想知道是否有一个元组操作可以像这样对元组执行无方向比较:

exp1 = undirected_comp((A,B), (B,A))    #exp1 should evaluate to True
exp2 = undirected_comp((A,B), (A,C))    #exp2 should evaluate to False

Tags: tofalsetrue方向元组evaluateshouldcomp
3条回答

不完全是,但一般来说,你可以用

set (A,B) == set (B, A)

当然可以: undirected_comp = lambda e1,e2: e1==e2 or (e1[1],e1[0])==e2

由于边总是精确的2元组,所以它应该足够健壮,假设A和B对象定义了相等。在

编辑(不知羞耻的自我提升):您可能不希望为每个比较器创建两个set对象的开销,特别是如果这是一个更大算法的一部分。集合非常适合查找,但是实例化要慢得多:https://stackoverflow.com/a/7717668/837451

除了使用集合的解决方案外,还可以很容易地滚动您自己的比较函数:

In [1]: def undirected_comp(tup1, tup2):
   ...:     return tup1 == tup2 or tup1 == tup2[::-1]

In [2]: undirected_comp(('A','B'), ('B','A'))
Out[2]: True

In [3]: undirected_comp(('A','B'), ('A','C'))
Out[3]: False

In [4]: undirected_comp(('A','B'), ('A','B'))
Out[4]: True

正如mmdanziger所指出的,这比使用集合的解决方案更快,因为您不必支付创建集合的成本。在

但是如果你关心速度并且你花在比较各种边上的时间多于创建它们的时间,那么最好不要将这些边存储为任意顺序的元组,而是预处理并以不同的格式存储它们。两个最好的选择可能是frozenset或排序的元组(即,按照惯例,您总是首先存储最小的节点)。一些快速的时机:

^{pr2}$

因此,假设您不关心边的创建时间,那么将它们存储为已排序的元组是进行比较的最快方法。在这种情况下,您只需要做一个简单的比较,而不必比较向后的情况,因为顺序是由预排序保证的。在

相关问题 更多 >