Last Updated: Sunday 20th January 2013

One of the most common tasks that requires random action is selecting one item from a group, be it a character from a string, unicode, or buffer, a byte from a bytearray, or an item from a list, tuple, or xrange. It's also common to want a sample of more than one item.

Don't do this when randomly selecting an item

A naive approach to these tasks involves something like the following; to select a single item, you would use randrange (or randint) from the random module, which generates a pseudo-random integer from the range indicated by its arguments:

An equally naive way to select multiple items might use random.randrange to generate indexes inside a list comprehension, as in:

These work, but as you should expect if you've been writing Python for any length of time, there's a built-in way of doing it that is briefer and more readable.

Do this instead, when selecting an item

The pythonic way to select a single item from a Python sequence type — that's any of str, unicode, list, tuple, bytearray, buffer, xrange — is to use random.choice. For example, the last line of our single-item selection would be:

Much simpler, isn't it? There's an equally simple way to select n items from the sequence:

Notes on duplicates

If the sequence contains duplicate values, each one is an independent candidate for selection. If you want to avoid duplicates, random.choice and random.sample can also operate on sets; simply create a set from your sequence using set(items) and proceed as above.

  • Drew

    Awesome, thanks for the tip!

  • John Doe

    random.choice CANNOT operate on sets.