Shuffling a list of objects Shuffling a list of objects python python

Shuffling a list of objects


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

from random import shufflex = [[i] for i in range(10)]shuffle(x)# print(x)  gives  [[9], [2], [7], [0], [4], [5], [3], [1], [8], [6]]# of course your results will vary

Note that shuffle works in place, and returns None.


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 randoma = 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


It took me some time to get that too. But the documentation for shuffle is very clear:

shuffle list x in place; return None.

So you shouldn't print(random.shuffle(b)). Instead do random.shuffle(b) and then print(b).


matomo