# Shuffling a list of objects

### Question

I have a list of objects in Python and I want to shuffle them. I thought I could use the `random.shuffle` method, but this seems to fail when the list is of objects. Is there a method for shuffling object or another way around this?

``````import random

class a:
foo = "bar"

a1 = a()
a2 = a()
b = [a1,a2]

print random.shuffle(b)
``````

This will fail.

1
694
6/19/2017 5:14:35 PM

`random.shuffle` should work. Here's an example, where the objects are lists:

``````from random import shuffle
x = [[i] for i in range(10)]
shuffle(x)

# print x  gives  [, , , , , , , , , ]
# of course your results will vary
``````

Note that shuffle works in place, and returns None.

1141
5/6/2016 1:27:59 AM

As you learned the in-place shuffling was the problem. I also have problem frequently, and often seem to forget how to copy a list, too. Using `sample(a, len(a))` is the solution, using `len(a)` as the sample size. See https://docs.python.org/3.6/library/random.html#random.sample for the Python documentation.

Here's a simple version using `random.sample()` that returns the shuffled result as a new list.

``````import random

a = range(5)
b = random.sample(a, len(a))
print a, b, "two list same:", a == b
# print: [0, 1, 2, 3, 4] [2, 1, 3, 4, 0] two list same: False

# The function sample allows no duplicates.
# Result can be smaller but not larger than the input.
a = range(555)
b = random.sample(a, len(a))
print "no duplicates:", a == list(set(b))

try:
random.sample(a, len(a) + 1)
except ValueError as e:
print "Nope!", e

# print: no duplicates: True
# print: Nope! sample larger than population
``````