
本文教你用python高效、准确地从62个国家中随机抽取48个,并严格均分为12组(每组恰好4人),避免因循环逻辑错误导致组数超限或末组不完整。
本文教你用python高效、准确地从62个国家中随机抽取48个,并严格均分为12组(每组恰好4人),避免因循环逻辑错误导致组数超限或末组不完整。
原始代码存在多个关键问题:
- 使用 for country in countries[:] 遍历时,内部又调用 countries.remove() 动态修改列表,导致遍历跳过元素、逻辑错乱;
- membersInGroup 的重置与打印时机混乱,未真正按“每4人一组”组织数据;
- random.choice() 单次调用无法保证无重复抽取,且未控制总数量为48。
✅ 正确做法是先抽样、再分组——两步分离,逻辑清晰、结果可控:
✅ 推荐解决方案(Python 3.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:将48个元素严格按每4个切分为12个元组
groups = list(batched(selected, 4))
# 输出结果(每组一行,国家用逗号分隔)
for i, group in enumerate(groups, 1):
print(f"Group {i}: {', '.join(group)}")? 兼容旧版Python(<3.12)替代方案
itertools.batched 在 Python 3.12+ 才引入。若使用 3.11 或更早版本,请用以下等效实现:
def batched(iterable, n):
iterator = iter(iterable)
while batch := list(islice(iterator, n)):
yield batch
from random import sample
from itertools import islice
selected = sample(countries, 48)
groups = list(batched(selected, 4))⚠️ 注意事项
- random.sample() 保证无放回随机抽样,不会重复选取同一国家;
- batched()(或自定义分组函数)确保严格按固定长度切片,48 ÷ 4 = 12 组,绝无余数或残组;
- 勿在遍历列表的同时修改它(如 remove()),这是初学者常见陷阱,应优先采用“生成新列表”而非“原地删减”。
? 小结
与其手动维护计数器和动态删除,不如信任标准库:sample() 处理随机性,batched() 处理结构化分组。两者结合,代码简洁、可读性强、结果精准——这正是Python“显式优于隐式”哲学的典型实践。


















