Advik Tripathi Advik Tripathi - 24 days ago 5
Python Question

How do you divide a list (indefinite length) randomly into 3 subgroups?

Lets say that my program asks a user to input a number indefinitely and I appended it in a list.

#Given Example:
List = [105, 167, 262, 173, 123, 718, 219, 272, 132]


what I wanted to do is to randomly pick any of the numbers so my sample output would be:

first = [105, 262, 173]
second = [167, 123, 132]
third = [718, 219,272]


Having said, since the user input would be indefinite there will be chances that it would be an odd number.

I am currently using random.sample to choose a number from that list and append it in a list, after that I'll append the sub-groups of list to create a list within a list.

Would be a great help if anyone answers, thanks!

Answer Source

You could shuffle your list with random.shuffle:

>>> import random
>>> l = [105, 167, 262, 173, 123, 718, 219, 272, 132]
>>> random.shuffle(l)
>>> l
[167, 123, 173, 718, 262, 272, 105, 219, 132]

And extract 3 sub-lists with slicing. The first list will have indices 0, 3 and 6 from the shuffled l, the second list will have indices 1, 4 and 7 and the third will have indices 2, 6 and 8:

>>> l[::3]
[167, 718, 105]
>>> l[1::3]
[123, 262, 219]
>>> l[2::3]
[173, 272, 132]

As a bonus, it will work with lists of any length:

>>> l = [1, 2, 3, 4, 5]
>>> random.shuffle(l)
>>> [l[x::3] for x in range(3)]
[[2, 4], [1, 5], [3]]

You can be sure that every element will appear exactly once in the nested lists.

You could also define more sublists:

>>> l = list(range(20))
>>> n = 5
>>> random.shuffle(l)
>>> [l[x::n] for x in range(n)]
[[5, 18, 9, 4], [11, 12, 1, 15], [13, 3, 6, 8], [17, 0, 14, 2], [10, 16, 7, 19]]