基于Python DataFrame实现跨团队开发与测试人员随机配对
实现方案
原始DataFrame包含3个字段:
name(人员姓名,格式为PersonX)、role(角色,分为Developer开发者、Tester测试人员)、team(所属团队)
实现思路
- 先按角色拆分数据,分别将开发者和测试人员按所属团队分组存储,方便后续快速筛选跨团队候选
- 配对时优先满足两个核心规则:配对双方不属于同一团队、连续配对序列中不出现同团队的同角色
- 特殊情况处理:如果当前没有满足连续规则的候选,先放宽连续规则保证跨团队配对的核心要求
- 大数据集适配:用分组存储的方式避免每次全量遍历候选,时间复杂度可控制在O(n)级别,支持万级以上数据量
代码实现
import pandas as pd import random from collections import defaultdict def cross_team_pair(df: pd.DataFrame) -> dict: # 按团队分组存储开发者和测试 dev_group = defaultdict(list) test_group = defaultdict(list) for _, row in df.iterrows(): if row['role'] == 'Developer': dev_group[row['team']].append(row['name']) else: test_group[row['team']].append(row['name']) # 打平为带团队标签的列表并打乱 all_dev = [(name, team) for team, names in dev_group.items() for name in names] all_test = [(name, team) for team, names in test_group.items() for name in names] random.shuffle(all_dev) random.shuffle(all_test) paired_result = {} used_test = set() last_dev_team = None last_test_team = None for dev_name, dev_team in all_dev: # 第一优先级:满足所有规则的候选 candidates = [] for test_name, test_team in all_test: if test_name not in used_test and test_team != dev_team and test_team != last_test_team and dev_team != last_dev_team: candidates.append((test_name, test_team)) # 无符合连续规则的候选时,放宽连续限制,保留跨团队核心要求 if not candidates: candidates = [ (t_name, t_team) for t_name, t_team in all_test if t_name not in used_test and t_team != dev_team ] # 随机选择配对 select_test, select_test_team = random.choice(candidates) paired_result[dev_name] = select_test used_test.add(select_test) last_dev_team = dev_team last_test_team = select_test_team return paired_result # 调用示例 if __name__ == "__main__": # 这里替换为你的实际DataFrame读取逻辑,比如pd.read_excel/ pd.read_csv df = pd.DataFrame([ ["Person1", "Developer", "TeamA"], ["Person2", "Developer", "TeamB"], ["Person6", "Tester", "TeamB"], ["Person9", "Tester", "TeamA"] ], columns=["name", "role", "team"]) result = cross_team_pair(df) # 按要求格式输出 print("{") for i, (dev, test) in enumerate(result.items()): end_str = "," if i != len(result)-1 else "" print(f" {dev}: {test}{end_str}") print("}")
扩展说明
- 如果数据集规模达到10万条以上,可将全量候选遍历逻辑替换为按团队取数:提前维护每个测试团队的可用人员队列,需要选候选时直接排除开发所属团队和上一个测试团队,直接从剩余团队的队列里随机取数即可,无需遍历所有测试人员
- 如果开发和测试人员数量不对等,可根据业务需求调整为支持一个开发配对多个测试,或剩余未配对人员单独输出的逻辑
内容的提问来源于stack exchange,提问作者Sri Chin
相关产品推荐
相关产品推荐

