在python中生成两个对的有效方法

2024-04-27 17:54:30 发布

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

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

  1. 在一对中,元素的顺序很重要:(element1,element2)!=(要素2,要素1)
  2. 在两对中,对的顺序并不重要:(pair1,pair2)==(pair2,pair1)

我编写了满足上述约束的伪代码,如下所示:

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
^{pr2}$
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在我的代码中花费了很长时间。有没有其他两对的表示法?或者,上面的代码可以改进吗?在


Tags: 代码selffalsereturnifdefhashisinstance
2条回答

你有什么理由需要自己编写类吗?我在您的规范中没有看到任何不能通过使用元组作为对和将集合作为两对来满足的。在

但是,如果你决定优化你自己的代码,总是从评测开始。谷歌“Python简介”和阅读前五个链接,如果你不确定如何。在

坚持使用标准的python数据结构可能会更好。tuple用于Pair,而{}用于TwoPair(尽管您可以编写一个set子类来添加__hash__方法)。在

例如:

import operator

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

考虑到您的makeTwoPairs函数需要很长时间才能执行,您可以这样重写它:

^{pr2}$

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

相关问题 更多 >