擅长:python、mysql、java
<p>我想你可以得到很多你想要的东西与切片一个混乱的名单。这样就避免了执行大量的pop或从列表中删除操作,这些操作的性能相对较差(不过,对于任何规模合理的组来说,性能并不重要)。整个代码需要<code>O(N+M)</code>时间,其中<code>N</code>是学生人数,<code>M</code>是组数(大多数其他答案是<code>O(M*N)</code>或更糟):</p>
<pre><code>import random
def make_groups(class_size, num_groups):
students = list(range(class_size))
random.shuffle(students)
group_size = class_size // num_groups # size of the smaller groups
smaller_groups = num_groups - class_size % num_groups # num of smaller groups
# start with smaller groups
groups = [students[i:i+group_size] for i in
range(0, smaller_groups*group_size, group_size)
# add longer groups
groups.extend(students[i:i+group_size+1] for i in
range(smaller_groups*group_size, class_size, group_size+1)
return groups
if __name__ == "__main__":
class_size = int(input('How many people are there in the class?'))
num_groups = int(input('How many groups would you like to create?'))
for group in make_groups(class_size, num_groups):
print group
</code></pre>
<p>运行示例:</p>
^{pr2}$
<p>这就产生了五组四人组和两组五人组。在</p>