2024-09-25 02:37:33 发布
网友
我目前正在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
不完全是,但一般来说,你可以用
set (A,B) == set (B, A)
当然可以: undirected_comp = lambda e1,e2: e1==e2 or (e1[1],e1[0])==e2
undirected_comp = lambda e1,e2: e1==e2 or (e1[1],e1[0])==e2
由于边总是精确的2元组,所以它应该足够健壮,假设A和B对象定义了相等。在
编辑(不知羞耻的自我提升):您可能不希望为每个比较器创建两个set对象的开销,特别是如果这是一个更大算法的一部分。集合非常适合查找,但是实例化要慢得多:https://stackoverflow.com/a/7717668/837451
set
除了使用集合的解决方案外,还可以很容易地滚动您自己的比较函数:
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或排序的元组(即,按照惯例,您总是首先存储最小的节点)。一些快速的时机:
frozenset
因此,假设您不关心边的创建时间,那么将它们存储为已排序的元组是进行比较的最快方法。在这种情况下,您只需要做一个简单的比较,而不必比较向后的情况,因为顺序是由预排序保证的。在
不完全是,但一般来说,你可以用
当然可以:
undirected_comp = lambda e1,e2: e1==e2 or (e1[1],e1[0])==e2
由于边总是精确的2元组,所以它应该足够健壮,假设A和B对象定义了相等。在
编辑(不知羞耻的自我提升):您可能不希望为每个比较器创建两个
set
对象的开销,特别是如果这是一个更大算法的一部分。集合非常适合查找,但是实例化要慢得多:https://stackoverflow.com/a/7717668/837451除了使用集合的解决方案外,还可以很容易地滚动您自己的比较函数:
正如mmdanziger所指出的,这比使用集合的解决方案更快,因为您不必支付创建集合的成本。在
但是如果你关心速度并且你花在比较各种边上的时间多于创建它们的时间,那么最好不要将这些边存储为任意顺序的元组,而是预处理并以不同的格式存储它们。两个最好的选择可能是
^{pr2}$frozenset
或排序的元组(即,按照惯例,您总是首先存储最小的节点)。一些快速的时机:因此,假设您不关心边的创建时间,那么将它们存储为已排序的元组是进行比较的最快方法。在这种情况下,您只需要做一个简单的比较,而不必比较向后的情况,因为顺序是由预排序保证的。在
相关问题 更多 >
编程相关推荐