Each item has an equal chance of being picked. The iterator is processed only once, and only the selected items are stored, making this function memory efficient.
This is based on idea from Richard Papworth's recipe that picks a random from a file - see http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/59865 - but is more general.
1 2 3 4 5 6 7 8 9
def random_items(iterator, items_wanted=1): selected_items = [None] * items_wanted for item_index, item in enumerate(iterator): for selected_item_index in xrange(items_wanted): if not random.randint(0, item_index): selected_items[selected_item_index] = item return selected_items