
本文教你用python精准实现:从62个国家中随机抽取48个,再严格均分到12个小组(每组恰好4人),避免余数导致的不均衡分组。
本文教你用python精准实现:从62个国家中随机抽取48个,再严格均分到12个小组(每组恰好4人),避免余数导致的不均衡分组。
你的原始代码存在几个关键问题:
- 使用 for country in countries[:] 遍历时,内部又调用 countries.remove() 动态修改列表,导致遍历逻辑错乱;
- 分组计数逻辑(membersInGroup)与实际打印、抽样未同步,且未真正构建分组结构;
- random.choice() 单次抽取无法保证不重复,也难以控制总数量和分组结构。
✅ 正确做法是两步分离、函数化处理:
- 随机无放回抽样:用 random.sample(population, k) 一次性选出48个不重复国家;
- 等长批量切分:用 itertools.batched(iterable, n) 将列表按每4个元素切分为元组(Python 3.12+内置),天然保证每组恰好4人,且总数整除(48 ÷ 4 = 12),零余数。
以下是简洁、健壮、可读性强的实现:
from random import sample
from itertools import batched
countries = ['Argentina', 'France', 'Belgium', 'England', 'Brazil', 'Portugal',
'Netherlands', 'Spain', 'Italy', 'Croatia', 'United_States', 'Colombia',
# ...(其余国家,同原列表)
'South_Africa', 'Republic_of_Ireland', 'Finland']
# 步骤1:随机抽取48个不重复国家
selected = sample(countries, 48)
# 步骤2:每4个一组,生成12个元组
groups = list(batched(selected, 4))
# 打印结果(格式清晰,便于验证)
for i, group in enumerate(groups, start=1):
print(f"Group {i}: {list(group)}")
? 注意事项:
- itertools.batched 是 Python 3.12+ 新增函数。若使用旧版本(如3.11或更早),可用兼容写法替代:
from itertools import islice def batched(iterable, n): iterator = iter(iterable) while batch := list(islice(iterator, n)): yield batch - sample() 自动确保无重复且随机性良好,无需手动 remove 或 choice 循环;
- 所有分组均为独立列表(或元组),后续可直接用于匹配、展示或导出。
? 总结:
不要在循环中边遍历边修改原列表,也不要用状态变量手动计数分组。用 sample + batched 组合,既语义清晰,又逻辑严谨——48个元素 ÷ 每组4人 = 精准12组,零误差、零冗余、零调试负担。这是Python数据分组任务的标准实践方式。











