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

Rai*_* Re 2 python random list python-3.x

假设我的程序要求用户无限期地输入一个数字,然后我将它附加到一个列表中。

#Given Example:
List = [105, 167, 262, 173, 123, 718, 219, 272, 132]
Run Code Online (Sandbox Code Playgroud)

我想要做的是随机选择任何数字,所以我的样本输出是:

first = [105, 262, 173]
second = [167, 123, 132]
third = [718, 219,272]
Run Code Online (Sandbox Code Playgroud)

话虽如此,由于用户输入将是不确定的,因此它可能是奇数。

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

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

Eri*_*nil 7

您可以使用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]
Run Code Online (Sandbox Code Playgroud)

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

>>> l[::3]
[167, 718, 105]
>>> l[1::3]
[123, 262, 219]
>>> l[2::3]
[173, 272, 132]
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

>>> 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]]
Run Code Online (Sandbox Code Playgroud)