Source code for niemads.RandomSet
#! /usr/bin/env python
from random import choice
[docs]class RandomSet:
'''``RandomSet`` class, which is a set with random (rather than arbitrary) pop'''
def __init__(self, initial=None):
'''``RandomSet`` constructor
Args:
``initial`` (iterable): Elements with which to initialize the ``RandomSet``
'''
self.elements = list() # list of elements
self.index = dict() # index[element] = index at which `element` appears in `self.elements`
if initial is not None:
for x in initial:
self.add(x)
def __contains__(self, x):
'''Check if an element ``x`` exists in this ``RandomSet``
Args:
``x``: The element to check
Returns:
``bool``: ``True`` if ``x`` exists in this ``RandomSet``, otherwise ``False``
'''
return x in self.index
def __iter__(self):
''' Iterate over the elements of this ``RandomSet``'''
for x in self.elements:
yield x
def __len__(self):
'''Return the number of elements in this ``RandomSet``
Returns:
``int``: The number of elements contained within this ``RandomSet``
'''
return len(self.elements)
def __str__(self):
'''Return a string representation of this ``RandomSet``
Returns:
``str``: A string representation of this ``RandomSet``
'''
return str(self.elements)
[docs] def add(self, x):
'''Add a new element ``x`` to this ``RandomSet``
Args:
``x``: The element to insert
'''
if x in self:
raise ValueError("Element already exists: %s"%x)
self.index[x] = len(self); self.elements.append(x)
[docs] def remove(self, x):
'''Remove the element ``x`` from this ``RandomSet``
Args:
``x``: The element to remove
'''
if x not in self:
raise ValueError("Element not found: %s"%x)
x_index = self.index[x]
self.elements[x_index] = self.elements[-1]; self.index[self.elements[-1]] = x_index
self.elements.pop(); del self.index[x]
[docs] def top_random(self):
'''Randomly return an element from this ``RandomSet``
Returns:
A random element from this ``RandomSet``
'''
return choice(self.elements)
[docs] def pop_random(self):
'''Randomly remove and return an element from this ``RandomSet``
Returns:
A random element from this ``RandomSet``
'''
x = self.top_random(); self.remove(x)
return x