在检查2个列表是否相等时使用python __eq__方法的问题

时间:2018-02-08 13:34:00

标签: python

我有一个python程序,其中我有一个名为Vector的类和一个正在填充运行时的类中的空列表。 这是 init

def __init__(self,n):
    self.vector = [];
    self.n = n;
    for x in range(n):
        self.vector.append(False);

这是 eq

def __eq__(self, other):
    t = True
    for x in range(self.n):
        if self.vector[x] != other.vector[x]:
            t = False;
    return t

然而,当我尝试检查这种类型的2个对象是否相等时,即使我在Vector类中更改了vector中的值,我也总是如此。 以下是我执行上述操作的代码:

vectors = []
    n = tmp.size();
    k = calculateCombinationCount(n,int(n/2))
    for i in range(k):
        for j in range(0,n-1):
            if (tmp.vector[j] != tmp.vector[j+1]):  
                t = True
                for x in vectors:
                    if x == tmp:
                        t = False;
                if t:
                    vectors.append(tmp)
                    tmp.printVector();
                tmp.swap(j,j+1);

感谢您提供的任何帮助。谢谢:))

编辑:

def swap(self,i,j):
    tmp = self.vector[i]
    self.vector[i] = self.vector[j]
    self.vector[j] = tmp

def calculateCombinationCount(n,r):
k = factorial(n)/(factorial(int(r))*factorial(int(n-r)))
return int(k)

1 个答案:

答案 0 :(得分:1)

是的,所以我已经更新了你的代码pythonic(我可以告诉你来自另一种语言,Java?)。

from math import factorial

class Vector:

    def __init__(self, size):
        self.size = size
        self.vector = [False] * size

    def __eq__(self, other):
        """
        Same if self.size == other.size
        """
        assert self.size == other.size, (self.size, other.size)
        return self.vector == other.vector

    def print_vector(self):
        print(self.vector)

    def swap(self, i, j):
        """
        More efficient and pythonic
        """
        self.vector[i], self.vector[j] = self.vector[j], self.vector[i]


def calculate_combination_count(n, r):
    """
    This is slow, I'd replace it with scipy.special.comb
    https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.comb.html#scipy.special.comb
    """
    return factorial(n) // (factorial(r) * factorial(n-r))


tmp = Vector(10)

vectors = []
n = tmp.size
k = calculate_combination_count(n, n // 2)
for i in range(k):
    for j in range(0, n-1):
        if tmp.vector[j] != tmp.vector[j + 1]:
            if not any(vec == tmp for vec in vectors):  # much more efficient
                vectors.append(tmp)
                tmp.print_vector()
            tmp.swap(j, j + 1)
        else:  # Just to prove why it doesn't work
            print('tmp.vector is all False: {}'.format(not all(tmp.vector)))

这会反复打印tmp.vector is all False: True。我想这是你的问题。

如果你