You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现奇数长度数组的随机分组:用三人组替代None配对

解决方案

可以通过判断列表长度的奇偶性,结合分组逻辑实现需求:当列表长度为奇数时生成一个三人组,其余为二人组;偶数时全部分为二人组。以下是两种实现方式:

方式一:直接拆分(无需依赖grouper)

这种方法逻辑直观,先打乱列表,再根据长度分情况处理:

import random

people = ['John','Jacob','Jill','Jane','Josephine']
random.shuffle(people)

groups = []
total = len(people)

if total % 2 != 0:
    # 奇数长度:先取前3个作为三人组
    groups.append(people[:3])
    # 剩余元素按二人组拆分(剩余数量必为偶数)
    remaining = people[3:]
    for i in range(0, len(remaining), 2):
        groups.append(remaining[i:i+2])
else:
    # 偶数长度:直接按步长2拆分所有元素
    for i in range(0, total, 2):
        groups.append(people[i:i+2])

# 打印分组结果
for idx, group in enumerate(groups, 1):
    if len(group) == 2:
        print(f"组{idx}: {group[0]} 和 {group[1]}")
    else:
        print(f"组{idx}: {group[0]}、{group[1]} 和 {group[2]}")

方式二:基于原有grouper函数修改

如果你想沿用原有的grouper函数,可以通过条件判断调整分组逻辑:

import random
from itertools import zip_longest

def grouper(iterable, n, fillvalue=None):
    args = [iter(iterable)] * n
    return zip_longest(fillvalue=fillvalue, *args)

people = ['John','Jacob','Jill','Jane','Josephine']
random.shuffle(people)

groups = []
total = len(people)

if total % 2 != 0:
    # 奇数长度:前total-3个元素用grouper生成二人组
    for pair in grouper(people[:-3], 2):
        groups.append(list(pair))
    # 最后3个单独作为一组
    groups.append(people[-3:])
else:
    # 偶数长度:用grouper生成所有二人组
    for pair in grouper(people, 2):
        groups.append(list(pair))

# 打印分组结果
for idx, group in enumerate(groups, 1):
    if len(group) == 2:
        print(f"组{idx}: {group[0]} 和 {group[1]}")
    else:
        print(f"组{idx}: {group[0]}、{group[1]} 和 {group[2]}")

核心逻辑说明

  1. 先通过random.shuffle()打乱列表,保证分组的随机性;
  2. 奇数长度时,提取3个元素作为三人组,剩余元素数量为偶数,可安全拆分为二人组;
  3. 偶数长度时,直接按每2个元素一组拆分即可。

内容的提问来源于stack exchange,提问作者DD1229

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 01:13:22