我需要一个功能类似于集合(快速插入、删除和成员资格检查)但能够返回随机值的 Python (2.7) 对象。以前在 stackoverflow 上提出的问题的答案如下:
import random
random.sample(mySet, 1)
但这对于大型集合来说非常慢(它在 O(n) 时间内运行)。
其他解决方案不够随机(它们依赖于 python 集的内部表示,这会产生一些非常非随机的结果):
for e in mySet:
break
# e is now an element from mySet
我编写了自己的基本类,它具有恒定时间查找、删除和随机值。
class randomSet:
def __init__(self):
self.dict = {}
self.list = []
def add(self, item):
if item not in self.dict:
self.dict[item] = len(self.list)
self.list.append(item)
def addIterable(self, item):
for a in item:
self.add(a)
def delete(self, item):
if item in self.dict:
index = self.dict[item]
if index == len(self.list)-1:
del self.dict[self.list[index]]
del self.list[index]
else:
self.list[index] = self.list.pop()
self.dict[self.list[index]] = index
del self.dict[item]
def getRandom(self):
if self.list:
return self.list[random.randomint(0,len(self.list)-1)]
def popRandom(self):
if self.list:
index = random.randint(0,len(self.list)-1)
if index == len(self.list)-1:
del self.dict[self.list[index]]
return self.list.pop()
returnValue = self.list[index]
self.list[index] = self.list.pop()
self.dict[self.list[index]] = index
del self.dict[returnValue]
return returnValue
有没有更好的实现,或者对这段代码有什么大的改进?