我想知道最接近“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
虽然我想知道是否已经有这样的实现了吗?