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

如何在Python中按互斥条件将列表拆分为两个子列表?

给随机分组代码添加互斥约束的解决方案

你的需求是将列表拆分为3人的A组和4人的B组,同时保证三对成员不同组。原随机拆分代码可能违反约束,这里提供两种可行方案:

方案1:循环重试法(简单直观)

通过反复随机打乱并检查分组是否符合所有互斥规则,直到得到有效结果。适合小规模数据集,实现成本低:

import random

ppl = ['tom','jill', 'barry', 'cate', 'tim', 'jody', 'john']
# 定义需要互斥的成员对
exclusive_pairs = [('tom', 'jill'), ('barry', 'cate'), ('tim', 'jody')]

team_a = []
team_b = []

# 循环生成分组,直到满足所有约束
while True:
    shuffled_ppl = ppl.copy()
    random.shuffle(shuffled_ppl)
    team_a = shuffled_ppl[:3]
    team_b = shuffled_ppl[3:]
    
    # 验证所有互斥对是否分属不同组
    is_valid = True
    for p1, p2 in exclusive_pairs:
        if (p1 in team_a and p2 in team_a) or (p1 in team_b and p2 in team_b):
            is_valid = False
            break
    if is_valid:
        break

print("Team A:", team_a)
print("Team B:", team_b)

说明

  • 每次打乱列表后拆分,逐一检查每对互斥成员是否在同一组
  • 由于数据集很小,循环次数不会太多,执行效率可接受

方案2:直接构造法(高效最优)

针对你的特定分组规模(3人A组、4人B组)和3组互斥对的情况,可以直接构造符合要求的分组,无需重试:

import random

ppl = ['tom','jill', 'barry', 'cate', 'tim', 'jody', 'john']
exclusive_pairs = [('tom', 'jill'), ('barry', 'cate'), ('tim', 'jody')]

team_a = []
team_b = []

# 遍历每对互斥成员,随机分配到不同组
for p1, p2 in exclusive_pairs:
    # 随机决定谁去A组、谁去B组
    if random.choice([True, False]):
        team_a.append(p1)
        team_b.append(p2)
    else:
        team_a.append(p2)
        team_b.append(p1)

# 剩余的john直接加入B组(此时A组已有3人,刚好满足规模要求)
team_b.append('john')

print("Team A:", team_a)
print("Team B:", team_b)

说明

  • 3组互斥对各选1人加入A组,刚好凑齐3人
  • 剩下的3名互斥成员加john组成4人的B组,天然满足所有互斥约束
  • 无需循环重试,执行效率最高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 15:49:56