如何将列表(不确定长度)随机分成3个子组?

时间:2017-09-25 09:20:20

标签: python python-3.x list random

让我们说我的程序要求用户无限期地输入一个数字,并将其附加在列表中。

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

我想要做的是随机选择任何数字,以便我的示例输出为:

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

话虽如此,由于用户输入将是无限期的,因此有可能是奇数。

我目前正在使用random.sample从该列表中选择一个数字并将其附加到列表中,然后我将附加列表的子组以在列表中创建列表。

如果有人回答,那将是一个很大的帮助,谢谢!

2 个答案:

答案 0 :(得分:3)

您可以使用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]

并使用slicing提取3个子列表。第一个列表将具有来自混洗l的索引0,3和6,第二个列表将具有索引1,4和7,第三个列表将具有索引2,6和8:

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

作为奖励,它可以使用任何长度的列表:

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

您可以确保每个元素在嵌套列表中只出现一次。

您还可以定义更多子列表:

>>> 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]]

答案 1 :(得分:0)

如果List仍然很短,以便您可以将其读入内存,那么您可以使用[random.shuffle][1]

import random
List = [105, 167, 262, 173, 123, 718, 219, 272, 132]

random.shuffle(List)
first = L[0:3]

现在使用列表理解来减去原始List first

newList = [item for item in List if item not in first]

现在对newListsecond使用third,您就可以开始了! :)