在python中制作两对的有效方法

时间:2011-03-01 05:22:26

标签: python algorithm data-structures

我想成对两对。 一对由两个元素组成,两对由两对组成。 以下是约束列表:

  1. 在一对中,元素的顺序很重要:(element1,element2)!=(element2,element1)
  2. 在两对中,对的顺序并不重要:(pair1,pair2)==(pair2,pair1)
  3. 我编写了满足上述约束的伪代码,如下所示:

    class Pair:
        def __init__(self, element1, element2):
            assert isinstance(element1, Element)
            assert isinstance(element2, Element)
            self.element1 = element1
            self.element2 = element2
    
        def __eq__(self, other):
            if not isinstance(other, Pair):
                return False
            if self.element1 != other.element1:
                return False
            if self.element2 != other.element2:
                return False
            return True
    
        def __ne__(self, other):
            return not (self.__eq__(other))
    
        def __hash__(self):
            return hash(self.element1) ^ hash(self.element2)
    
        def getFirst(self):
            return self.element1
    
        def getSecond(self):
            return self.element2
    class TwoPair:
        def __init__(self, pair1, pair2):
            assert isinstance(pair1, Pair)
            assert isinstance(pair2, Pair)
            self.pair1 = pair1
            self.pair2 = pair2
    
        def __eq__(self, other):
            if not isinstance(other, TwoPair):
                return False
            if self.pair1 == other.pair1 and self.pair2 == other.pair2:
                return True
            if self.pair1 == other.pair2 and self.pair2 == other.pair1:
                return True
            return False
    
        def __ne__(self, other):
            return not (self.__eq__(other))
    
        def __hash__(self):
            return hash(self.pair1) ^ hash(self.pair2)
    
        def getFirst(self):
            return self.pair1
    
        def getSecond(self):
            return self.pair2
    def makeTwoPairs(allPairs):
        allTwoPairs = set([])
        for pair1 in allPairs:
            for pair2 in allPairs:
                if pair1 == pair2:
                    continue
                twoPair = TwoPair(pair1, pair2)
                if twoPair in allTwoPairs:
                    continue
                else:
                    allTwoPairs.add(twoPair)
        return allTwoPairs

    函数makeTwoPairs在我的代码中需要很长时间。两对还有其他代表吗?或者,上述代码可以改进吗?

2 个答案:

答案 0 :(得分:3)

你可能会更好地坚持使用标准的python数据结构。 tuple的{​​{1}}和Pair的{​​{1}}(尽管您可以编写set子类来添加TwoPair方法。

例如:

set

关于您的__hash__函数需要很长时间才能执行的事实,您可以像这样重写它:

import operator

class TwoPairs(set):
  def __hash__(self):
    return reduce(operator.xor, map(hash, self))

然后,您只会生成唯一 makeTwoPairs,而不会在每次向结果集添加新对之前发生组合爆炸或测试开销。

答案 1 :(得分:2)

您是否有理由编写自己的课程?我没有在你的规范中看到任何使用元组作为成对并设置为两对无法满足的内容。

但是,如果您决定优化自己的代码,请始终从分析开始。 Google“Python个人资料”,如果您不确定如何,请阅读前五个链接。