我认为最好的方法是在中使用MutableSet
抽象基类collections
。继承MutableSet
,然后定义add
,discard
,__len__,
__iter__
,和__contains__
; 也重写,__init__
以选择接受序列,就像set
构造函数一样。MutableSet
提供set
基于这些方法的所有其他方法的内置定义。这样,您便可以set
廉价获得完整的接口。(如果执行此操作,addIterable
则在名称下为您定义extend
。)
discard
在标准set
界面中似乎就是您在delete
这里所说的。因此,将其重命名delete
为discard
。同样,除了拥有一个单独的popRandom
方法,您可以popRandom
像这样定义:
def popRandom(self):
item = self.getRandom()
self.discard(item)
return item
最后,在项目删除方法中(delete
现在,discard
根据标准set接口),您不需要if语句。无需测试是否index == len(self.list) - 1
,只需将列表中的最后一项与要弹出的列表的索引处的项交换,然后对反向索引字典进行必要的更改。然后从列表中弹出最后一项,并将其从字典中删除。无论是否index == len(self.list) - 1
:
def discard(self, item):
if item in self.dict:
index = self.dict[item]
self.list[index], self.list[-1] = self.list[-1], self.list[index]
self.dict[self.list[index]] = index
del self.list[-1] # or in one line:
del self.dict[item] # del self.dict[self.list.pop()]