1

私はPythonでセットを再実装しましたが、複数の共通部分に問題があります。「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))

私には2つの異なる行動があります

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

2つ目が違うのでわかりませんが、私の意見では、同じ動作をする必要があります。誰かが私を助けてくれますか?

4

1 に答える 1

6

Extend.intersect多くのセット間の交差を計算しません。selfとの和集合の交点を計算しothersます。

x & y & zcalls Extend.intersect(Extend.intersect(x,y), z)、 while x.intersect(y,z)calls 、および実際にExtend.intersect(x, *[y,z])何が行われるかを考えると、それらはたまたま異なる操作になるため、結果は異なります。Extend.intersect

于 2012-05-29T10:33:23.420 に答える