2017-09-25 89 views
1

可以说我的程序要求用户无限期地输入一个数字,并将其附加到列表中。如何将一个列表(无限长度)随机分为3个子组?

#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从该列表中选择一个数字并将其附加到列表中,之后我将追加列表的子组以在列表内创建一个列表。

如果有人回答,会很有帮助,谢谢!

+4

为什么不使用'random.shuffle'在列表中,然后选择一些东西来分组数据块从https://stackoverflow.com/questions/312443/how-do-you-split-一个列表成均匀大小的块? –

回答

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次名单。第一列表将具有索引0,从混洗l 3和6中,第二列表将具有索引1,4和7和第三将具有索引1,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]] 
+0

千万不要这么想,非常感谢!我试图手动附加每个随机生成的数字,使我的生活变得艰难。 –

0

如果列表是要保持简短,这样你可以将它读入内存,那么你可以使用[random.shuffle][1]

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

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

现在使用列表理解减去原来Listfirst

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

现在使用newList代替secondthird,你会很开心! :)

相关问题