如何在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
相关产品推荐
相关产品推荐

