Множественное пересечение Python

Я повторно реализовал набор в python, но у меня есть проблема с множественным пересечением.... Я следил за книгой Learning Python, но у меня проблема с моим кодом

class Set:
    def __init__(self,value=[]):
        self.data = []
        self.remDupli(value)

    def remDupli(self,val):
        for i in val:
            if i not in self.data:
                self.data.append(i)

    def intersect(self,other):
        val=[]
        for i in self.data:
            for k in other:
                if i == k:
                    val.append(i)
        return Set(val)

    def union(self,other):
        val=self.data
        for i in other:
            if i not in self.data:
                val.append(i)
        return Set(val)

    def __or__(self,a):       return self.union(a)
    def __and__(self,a):      return self.intersect(a)
    def __len__(self):        return len(self.data)
    def __getitem__(self,key):  return self.data[key]
    def __repr__(self):       return 'Set: ' +repr(self.data)

class Extend(Set):
    def intersect(self, *others):
        val = []
        for i in self:
            for x in others:
                if i in x:
                    val.append(i)
        return Set(val)

но когда я запускаю это:

x = Extend([1,2,3,4])
y = Extend([3,4,5])
z = Extend([0,1,2])
print(x & y & z)
print(x.intersect(y, z))

у меня два разных поведения

Set: []
Set: [1, 2, 3, 4]

Я не понимаю, потому что второй отличается, на мой взгляд, у них должно быть одинаковое поведение, кто-нибудь может мне помочь?


person fege    schedule 29.05.2012    source источник
comment
x.intersect(y.intersect(z)) будет вести себя так же, как x & y & z   -  person Christian Witts    schedule 29.05.2012


Ответы (1)


Extend.intersect не вычисляет пересечение множества наборов. Он вычисляет пересечение между self и объединением числа others.

Результаты различаются, потому что x & y & z вызывает Extend.intersect(Extend.intersect(x,y), z), а x.intersect(y,z) вызывает Extend.intersect(x, *[y,z]) и, учитывая то, что Extend.intersect на самом деле делает, это разные операции.

person hamstergene    schedule 29.05.2012
comment
Могу ли я изменить свой код, чтобы иметь такое же поведение? или мне нужно только изменить способ вызова таким образом x.intersect(y.intersect(z))? - person fege; 29.05.2012
comment
@fege Зависит от того, но я чувствую, что ваша настоящая проблема в том, что вы неправильно поняли алгоритм, поэтому вам нужно исправить его, а не вызывающий код. - person hamstergene; 29.05.2012
comment
Я думаю, что Extend.intersect должен использовать базовую реализацию, определенную в классе Set. Кстати, я ожидаю, что Extend.intersect вернет объект Extend. - person Jeannot; 29.05.2012