Skip to main content
 首页 » 编程设计

Python多重交集

2025年05月04日18mate10pro

我在 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] 

我不明白,因为第二个是不同的,在我看来他们应该有相同的行为,任何人都可以帮助我吗?

请您参考如下方法:

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 实际上确实如此,这些恰好是不同的操作。