"Is it possible to redefine the equal operator for tuples"
差不多吧。不能在基本tuple类型上执行此操作,但可以在子类上执行此操作:
class MyTuple(tuple):
def __eq__(self, other):
orig_eq = super(MyTuple, self).__eq__(other)
if orig_eq and orig_eq is not NotImplemented:
return True
else:
return super(MyTuple, self).__eq__(other[::-1])
差不多吧。不能在基本
tuple
类型上执行此操作,但可以在子类上执行此操作:一般来说,这可能不是最好的方法。根据问题的限制条件,您可以尝试一组冻结集:
^{pr2}$这里的优点是,如果您对同一数据执行多个成员身份测试,您可能会获得更好的运行时间(列表中的每个成员身份测试都是
O(N)
,您需要为每个要检查的项执行最多两个,而您只需要一个O(N)
步骤来构建f1_set
,然后每个成员资格测试都是O(1)
)。在您不能重写现有类型的equality方法,因此必须创建自己的类型,然后要求您用自定义类型替换所有现有元组。在
如果您的主要问题只是
(6,1) in f1
用例,那么也许您应该考虑为此创建一个方法:然后你就可以这样使用它:
^{pr2}$这样做的好处是,您不需要用不同的类型替换元组。因此,您可以按原样处理所有数据源。在
您应该创建一个tuple子类并更改它的相等方法(
__eq__
):适用于您的情况(tuple length==2,如果元组元素是散列的-这是不可变的,并且有一个定义良好的比较)
要将元组列表转换为无序元组列表,请执行以下操作:
^{pr2}$要对列表进行正确的包含查询(使用
in
运算符)可能会很慢,因此最好使用集合而不是列表:这个实现的性能不是很好,因为它为每个比较创建一个新的
set
。因此,如果元组总是f两个元素,那么将__eq__
方法取消制冷会更有效,如下所示:相关问题 更多 >
编程相关推荐