セットのように機能し (高速挿入、削除、およびメンバーシップ チェック)、ランダムな値を返す機能を持つ 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
これに対するより良い実装、またはこのコードに行われる大きな改善はありますか?