Python中的SetList;两全其美

时间:2015-05-17 11:47:54

标签: python list set

我想知道最接近“SetList”的是什么;一个包含列表和集合的所有惊人属性的列表。

例如,我想像列表一样索引/子集它,但是使用contains检查集合,并确保其中的所有内容都是唯一的。

为什么不让一个集合和一个列表占用相同的值(我知道这是一个可怕的想法,必须有一种方法来包含值一次)?我认为可以实现所有方法,使列表和集合始终保持同步。

我从这样的事情开始:

class SetList():
    def __init__(self, x = None):
        if isinstance(x, list):
            self.l = []
            self.s = set()
            for y in x:
                if y not in self.s:
                    self.l.append(y)
                    self.s.add(y)
        elif isinstance(x, set):            
            self.l = list(x)
            self.s = x
        elif isinstance(x, SetList):
            self.l = SetList.l
            self.s = SetList.s
        elif x is None:
            self.l = []
            self.s = set()
        else:
            self.l = [x] 
            self.s = set(self.l)

    def append(self, a):
        if a not in self.s:
            self.l.append(a)
            self.s.add(a)

    def add(self, a):
        self.append(a)        

    def remove(self, r):
        if r in self.s:
            self.l.remove(r)
            self.s.remove(r)

    def pop(self, p = None):
        if p is not None:
            x = self.l.pop(p) 
        else:
            x = self.l.pop()
        self.s.remove(x)
        return x

    def __getitem__(self, i): 
        if isinstance(i, int):
            return self.l[i]
        else:
            return SetList(self.l[i])

    def __len__(self):
        return len(self.s)    

    def __repr__(self):
        return 'SetList({})'.format(self.l)

    def __add__(self, container):
        for x in container:
            if x not in self.s:
                self.add(x)
        return self        

    def __iter__(self):
        return self.l.__iter__()

    def __item__(self, x): 
        return self.l.__item__(x)

    def __and__(self, x):
        return self.__add__(x)

    def __eq__(self, x):
        try:
            return self.l == x.l
        except AttributeError: 
            return False

在这里看到行动中的善良:

sl = SetList()

for x in [1,2,3,4,1,2,3]:
    sl.add(x)

>>> sl[1:2] + [1,3] != sl[1:2] & [3,1]
True
>>> sl[1:2] + [1,3] == sl[1:2] & [1,3]
True

虽然我想知道是否已经有这样的实现了吗?

0 个答案:

没有答案